python内置的调试工具-pdb
最近写python代码,当代码逻辑复杂时,总是要检查是否正确运行。但是光用print
显得较为麻烦,在网上找到了内置的调试工具pdb
,使用起来比print
要舒服,因此特来总结一下pdb
的使用。
pdb
有两种使用方法:
-
非侵入式(不需要额外修改源代码,在命令行下直接运行即可调试):
python -m pdb filename.py
-
侵入式(在调试代码中添加一行代码,之后在正常运行)
import pdb pdb.set_trace()
python filename.py
当命令行前面出现(pdb)
时,就表示调试工具pdb
启动成功。
当前所在位置会用->
进行标注,表示即将访问该行代码。
查看源码
l
:查看当前位置前后11行源代码。
l
:查看全部源代码。
设置断点
b
:添加断点
b line_num
:在line_num
处添加断点b filename:line_num
:在filename
文件的line_num
行添加断点b function_name
:在function_name
处添加断点
tbreak
:添加临时断点(执行一次后自动删除)
cl
:清除断点
cl filename:line_num
cl bp_number1 .. bp_number_n
:清除1-n
的断点序号
非逐行调试命令
c
:持续执行下去,直到遇到一个断点
unt line_num
:持续执行直到到达指定行或遇到断点。
j
:直接跳转到指定行(被跳过的代码不执行)
until
命令用于跳过代码,直到到达指定的行号。但是,如果你指定的行号小于当前行号,PDB 会报错。
jump
命令用于跳转到指定的行号,但它有一些限制:
- 你只能跳转到当前代码块内的行号。
- 你不能跳转到比当前行号更早的行号(即不能倒退)。
逐行调试命令
s
:执行下一行,可以进入函数体
n
:执行下一行,不会进行函数体
r
:执行下一行。若在函数内则会直接执行到函数返回处
打印变量
p var1 .. var_n
:打印变量值。
打印变量类型
whatis var
启动交互式解释器
interact
。
退出交互模式:
Linux/Mac
:Ctrl + D
Windows
:Ctrl + Z
退出pdb
q
修改变量
已存在值进行修改:!var = new_var
未存在值设置:var = var_value
将调试的输入输出信息进行保存
pdb
调试可以在终端上很容易就看到调试的信息,但是在分析的时候可能由于对调试信息有缺漏导致判断错误。因此可以将调试的输入输出不仅展示在终端上,还进行保存,方便进一步检查。
{使用pdb进行调试的指令} | tee debug.log
tee
是一个在 Unix/Linux 系统中常用的工具,可以将命令的输出同时保存到文件和终端。结合tee
,可以将 PDB 的交互式输入和输出全部保存到日志文件中。
(base) PS E:\Graduate\ML_PDE\ML> python .\lab.py | tee debug.log
> e:\graduate\ml_pde\ml\lab.py(4)<module>()
-> a = [1,3,3,4,5,6,7,8,9,10]
unt 15
(Pdb) > e:\graduate\ml_pde\ml\lab.py(15)<module>()
-> main(a)
p a,b
(Pdb) ([1, 3, 3, 4, 5, 6, 7, 8, 9, 10], array([[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.]]))
whatis a
(Pdb) <class 'list'>
whatis b
(Pdb) <class 'numpy.ndarray'>
q
Traceback (most recent call last):
File "E:\Graduate\ML_PDE\ML\lab.py", line 15, in <module>
main(a)
File "E:\Graduate\ML_PDE\ML\lab.py", line 15, in <module>
main(a)
File "E:\Anacoda_store\lib\bdb.py", line 90, in trace_dispatch
return self.dispatch_line(frame)
File "E:\Anacoda_store\lib\bdb.py", line 115, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit
(Pdb)
10分钟教程掌握Python调试器pdb - 知乎 (zhihu.com)