pdb是一款非常常用的编辑利器,之前有陈东大佬使用这个加快程序开发的进度,目前另一名同事也在使用pdb进行断点调试,调试速度与质量远远高于个人常用的print语句。后期要迅速且大胆的开展运用,将这个利器尽快应用于工作实践。

经过实践,发现基于pdb构建的ipdb插件更易于发现代码内部的错误,推荐大规模的进行使用。

python -m pdb
n
b evaluation.py:15
c
l
q
s

1. pdb & ipdb

如果你还主要靠print来调试代码,那值得花10分钟试试pdb这个Python自带的Debug工具。(Yean, its me…)

pdb有2种用法:

非侵入式方法(不用额外修改源代码,在命令行下直接运行就能调试)
python3 -m pdb filename.py
侵入式方法(需要在被调试的代码中添加一行代码然后再正常运行代码)
import pdb;pdb.set_trace()
当你在命令行看到下面这个提示符时,说明已经正确打开了pdb

(Pdb)
然后就可以开始输入pdb命令了,下面是pdb的常用命令

2. 常见命令

2.1、查看源代码
命令:l
说明:查看当前位置前后11行源代码(多次会翻页)
当前位置在代码中会用–>这个符号标出来

命令:ll
说明:查看当前函数或框架的所有源代码

2.2、添加断点
命令:

b
b linenumber
b filename:linenumber 
b functionname

参数:
filename 文件名,断点添加到哪个文件,如test.py
linenumber 断点添加到哪一行
function:函数名,在该函数执行的第一行设置断点

说明:
1.不带参数表示查看断点设置
2.带参则在指定位置设置一个断点

2.3、添加临时断点
命令:

tbreak
tbreak linenumber
tbreak filename:linenumber
tbreak functionname

参数:同b
说明:执行一次后时自动删除(这就是它被称为临时断点的原因)

2.4、清除断点
命令:

cl
cl filename:linenumber
cl bpnumber [bpnumber ...]

参数:bpnumber 断点序号(多个以空格分隔)

说明:
1.不带参数用于清除所有断点,会提示确认(包括临时断点)
2.带参数则清除指定文件行或当前文件指定序号的断点

2.5、打印变量值

  1. 打印变量值时,对于一般变量varibal可以直接在terminal环境下敲击varibal得到显示结果。
  2. 对于和ipdb中输入相同的n、s 、l相同的变量名,可以通过print(n)、print(l)等形式完成对变量的打印。

2.6、逐行调试命令
包括 s ,n , r 这3个相似的命令,区别在如何对待函数上

命令1:s
说明:执行下一行(能够进入函数体),用来进入函数

命令2:n
说明:执行下一行(不会进入函数体),用来常规的执行下一行

命令3:r
说明:执行下一行(在函数中时会直接执行到函数返回处),用于在函数内部时return

2.7、非逐行调试命令
命令1:c
说明:持续执行下去,直到遇到一个断点

命令2:unt linenumber
说明:持续执行直到运行到指定行(或遇到断点)

命令3:j linenumber
说明:直接跳转到指定行(注意,被跳过的代码不执行)

2.8、查看函数参数

命令:a
说明:在函数中时打印函数的参数和参数的值

2.9、打印变量类型
命令:whatis expression
说明:打印表达式的类型,常用来打印变量值

2.10、启动交互式解释器
命令:interact
说明:启动一个python的交互式解释器,使用当前代码的全局命名空间(使用ctrl+d返回pdb)

2.11、打印堆栈信息
命令:w
说明:打印堆栈信息,最新的帧在最底部。箭头表示当前帧。

2.12、重新启动 ipdb
命令:restart
使用restart重新启动调试器,断点等信息都会保留。restart实际是run的别名,使用run args的方式传入参数。

2.13、退出pdb
命令:q

3. pycharm debug

pycharm的Debug 模式也是非常的好用,之前也是一直看同事在用自己还没有深入进来使用;现在发现有了ipdb和pycharm,自己代码的debug速度和效率简直突飞猛进,心情还是非常舒畅的。

2020年,对于debug工具和git使用技能可以说进步很快;对于pytorch相关的网络知识与实操能力,进步的速度也是飞快,是非常有收获的一年了。如果能够更开心一点,氛围更融洽一点就更好了。

step over(F8快捷键)

在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在不存在子函数的情况下是和step into效果一样的。简单的说就是,程序代码越过子函数,但子函数会执行,且不进入。

step into(F7快捷键)

在单步执行时,遇到子函数就进入并且继续单步执行,有的会跳到源代码里面去执行。

step into my code(Alt+Shift+F7快捷键)

在单步执行时,遇到子函数就进入并且继续单步执行,不会进入到源码中(防止进入源码,半天绕不出来)。

step out(Shift+F8快捷键)

假如进入了一个函数体中,你看了两行代码,不想看了,跳出当前函数体内,返回到调用此函数的地方,即使用此功能即可。

Resume program(F9快捷键)

继续恢复程序,直接运行到下一断点处。

以上就是Pycharm编译器中最为常用的功能。一般操作步骤就是,设置好断点,debug运行,然后 F8 单步调试,遇到想进入的函数 F7 进去,想出来在 shift + F8,跳过不想看的地方,直接设置下一个断点,然后 F9 过去。

更多推荐