Pycharm Debug功能详解

初学Python时,我们可能都是通过print来调试程序,但这种方法效率不高。入门Python后,Pycharm的Debug功能还是有必要学一下的,可以提高调试代码的效率。

什么是Debug模式:
简单说Debug模式和正常运行唯一的区别,就是会在断点处停下来,可以通过控制一行一行的去运行代码,而且可以看到整个运行过程中所有变量的实时值。

如何设置断点:
在代码编辑区的行号后左键单击,即可将该行设置为断点,再次点击则取消。

如何以Debug模式运行代码:

方法1:点击左上工具栏上的Debug图标(虫子图形)
方法2:右击,在菜单中点Debug


Debug运行时界面:

我们编写2个示例代码文件
test1.py:

from test2 import add


def fun(d):
    a = d.get("a", 2)
    b = d.get("b", 2)
    c = add(a, b)
    print(c)
    for i in range(3*c):
        print(i)


if __name__ == '__main__':
    d = {"a": 1}
    fun(d)

test2.py:

def add(x, y):
    return x + y

设置断点,开启 debug 调试模式运行后,显示如图

 

可以看到,此时:
1.代码编辑区蓝条就是当前程序运行到的位置,即该运行c = add(a, b)了,但还没有运行

2.代码编辑区暗红条就是当前程序设置的所有断点行

3.左下是程序堆栈,蓝条代表当前是运行到test1.py文件的第7行了,是在fun()函数中。
蓝条下面那行,指是停在test1.py的第15行,即最开始运行程序,程序从13行的main开始,运行到第15行后,进入了fun()函数

4.右下是变量展示区,现在默认选中的是堆栈的顶部,即fun函数,可以看到,此时a,b,d变量的值。如果我们点堆栈的第2行,将显示main那一层的变量和值。


Debug工具栏说明:

下面来看看Debug区最左边那一竖排调试相关按钮都是干啥的:

 

再来看看更重要的横排按钮:

 

1.跳转到当前断点(断点后你为了查看逻辑可能去了其他文件或行,点这个就能回到当前断点的行)

2.step over(F8快捷键):在当前层代码单步执行。例子中即左下的堆栈,当前是test1.py第7行的fun函数,按F8后会执行第7行,停在第8行

3.step into(F7快捷键):单步执行,但会进入子函数。例子中左下堆栈顶是fun,test1.py:7,按F7后会进入add函数,跳转到test2.py第2行的add函数,此时看左下堆栈顶就是add,tet2.py:2。如果一直按F7,则会一层层一直进入。

 

4.step into my code(Alt+Shift+F7快捷键):单步执行,只进入自己代码的子函数,不会进入导入包的子函数。

我们把上面test1.py的代码添加个requests语句,并把第8、9行设成断点
test1.py:

from test2 import add
import requests


def fun(d):
    a = d.get("a", 2)
    b = d.get("b", 2)
    requests.get("http://www.baidu.com")
    c = add(a, b)
    print(c)
    for i in range(3*c):
        print(i)


if __name__ == '__main__':
    d = {"a": 1}
    fun(d)

现在再来看代码,test1.py,test2.py是我们自己的代码,requests库是我们引入的第3方包。

 

Debug运行后,停在第8行,按Alt+Shift+F7,会执行第8行,停在第9行(因为requests.get是导入库的函数,不是自己的代码,不进入)。再按一次Alt+Shift+F7,会跳转到test2.py第2行的add函数,因为test2.py是自己的代码。


5.force step into(Alt+Shift+F7快捷键):执行下一行忽略lib和构造对象等。

6.step out(Shift+F8快捷键):返回上一层函数(即左下堆栈的第2行)。
我们把test2.py的代码多写两行
test2.py:

def add(x, y):
    x += 1
    y += 2
    print(x)
    print(y)
    return x + y

重新Debug,当断点到test1.py的c = add(a, b),按F7,进入test2.py第2行,再按F7停在第3行,如果你不想再看add()函数中的运行,按Shift+F8,会返回test1.py中


7.run to cursor(Alt+F9快捷键):执行到光标的代码行前,如果有代码中设置了断点,会在该断点处暂停,等待进一步调试指令。

8.evaluate expression:计算表达式。
我们点击这个计算器图标后,在打开的界面中可以输入表达式,点evaluate后会给出结果

 

我们也可以输入类似:

d
d.get('a')
a * b


Debug变量区

接下来我们再看看右下的变量区,Debug过程中我们随时可以查看到所有变量和对象的实时值。但真正的程序,变量成百上千,从中翻找1个变量太麻烦,我们可以设置特别关注的变量。点左侧那一竖排按钮中的+号,输入变量a,则会在最上出现变量a,并高亮。-号就是删除一个关注变量。

 

假如我们要关注的变量也有10个,加上原有的变量,一个窗口显示太紧张,点击眼镜图标,则会分开展示。

 

另外我们不光可以在右下的变量区查看变量,Debug过程中代码后面也会显示出实时变量的值。并且当点击某变量后,也会浮窗显示

 


最后,教大家2个调试的小技巧。

直接Debug循环的第X次:

如test1.py,我们只在print(i)处打断点,希望看循环第6次i的值,正常运行到该行断点后,我们可以F8单步调试,更快的可以F9或ALT+F9跳到下一个断点,但即使这样,也要按6次才能到,假如循环是10000次,我们想看第5000次那不累死了。

在该行断点上右击,在Condition中输入表达式i==5,再次运行,则会跳过前4次,直接停在i为5的那次。

 

修改Debug过程中的变量值

或者我们也可以粗暴点,直接改i的值。我们取消上面Condition中的表达式,正常Debug,到断点时,i=0,我们在右下变量区右击i,选择Set Value,把i的值改成5,再按F8单步运行,可以看到print出来的是5了。之后再按F8往下走时,i会回归到正常值1

 

posted @ 2023-08-11 22:29  ☆星空物语☆  阅读(1320)  评论(0编辑  收藏  举报