python调试之pdb
一、PDB调试命令
完整命令 | 简写命令 | 描述 |
args | a | 列出当前函数的参数 |
break | b <行号> | 在某一行设置断点 |
break | b <文件名>:<行号> | 在某个文件的某行打一点断点 |
break | b <函数名> | 在某个含税的第一行打一个断点 |
clear | cl | 清除所有断点 |
clear | cl n1 n2 | 清除编号为n1、n2的断点 |
condition | 无 | 设置条件断点 |
disable | 无 | 禁用断点 |
enable | 无 | 启用断点 |
help | h | 查看pdb帮助 |
next | n | 执行下一条语句,遇到函数不进入其内部 |
step | s | 执行下一条语句,遇到函数会进入其内部 |
continue | c或者cont | 执行到下一个断点 |
ignore | 无 | 忽略断点 |
jump | j | 跳转到指定行数运行 |
list | l | 列出源码(前后11行代码) |
list | l <行号> | 列出某行周围11行代码(即这一行为中间行,列出它上下各5行) |
list | l <行号1> <行号2> | 列出两个行号范围内的代码 |
p | p | 打印变量值,也可以用print |
pp | pp | 好看一点的输出 |
quit | q | 退出 pdb |
return | r | 一直运行到函数返回 |
tbreak | 无 | 设置临时断点,断点只中断一次 |
where | w | 打印当前执行堆栈(查看所在的位置) |
! | 无 | 在pdb中执行语句 |
二、关键命令
1.断点设置 (Pdb) b 10 # 断点设置在本py的第10行 (Pdb) b test.py:20 # 断点设置到 test.py第20行 2.删除断点 (Pdb) b # 查看断点编号 (Pdb) cl 2 # 删除第2个断点 3.运行 (Pdb) n # 单步运行 (Pdb) s # 细点运行 也就是遇到函数、方法会进入里面 (Pdb) c # 跳到下个断点 4.查看 (Pdb) p param # 查看当前 变量值 (Pdb) l # 查看运行到某处代码 (Pdb) a # 查看全部栈内变量 5.打印变量 (Pdb)p param # 如果变量是个复杂的对象,可以先打印查看变量的属性,然后查看变量的某个属性值 (Pdb)p dir(param) (Pdb)p param.xxx
三、调试示例
1、示例1
1.代码示例 import pdb s1 = 'aaa' pdb.set_trace() s2 = 'bbb' s3 = 'ccc' pdb.set_trace() s = s1 + s2 + s3 print(s) 可以看到上面代码使用pdb.set_trace()函数打了两个断点(第4、7行) 2.开始调试 执行上面代码就进入了调试状态: > d:\projects\pythonprojects\3.25pdb\test.py(4)<module>() -> s2 = 'bbb' # -> 表示执行到了这里,但是还没有真正执行,因此此时的s2仍未被赋值 (Pdb) 可以看出直接执行到了第一个断点所在的下一行,并停在了这里。 这时可以执行命令: n 进行下一步: (Pdb) n > d:\projects\pythonprojects\3.25pdb\test.py(5)<module>() -> s3 = 'ccc' # -> 表示执行到了这里,但是还没有真正执行,因此此时的s3仍未被赋值,但前面的代码都执行了 (Pdb) 使用 p <变量名> 命令打印已经出现过的变量的值: (Pdb) p s1 'aaa' (Pdb) p s2 'bbb' (Pdb) p s3 *** NameError: name 's3' is not defined (Pdb) 因为当前变量s3还没有被赋值,所以打印s3的时候提示 NameError 异常。 使用 l 命令打印出当前的代码段: (Pdb) l 1 import pdb 2 s1 = 'aaa' 3 pdb.set_trace() 4 s2 = 'bbb' 5 -> s3 = 'ccc' 6 pdb.set_trace() 7 s = s1 + s2 + s3 8 print(s) 退出调试: q 命令 Traceback (most recent call last): File "D:/Projects/PythonProjects/3.25pdb/test.py", line 5, in <module> s3 = 'ccc' File "D:/Projects/PythonProjects/3.25pdb/test.py", line 5, in <module> s3 = 'ccc' File "C:\Python\Python36\lib\bdb.py", line 51, in trace_dispatch return self.dispatch_line(frame) File "C:\Python\Python36\lib\bdb.py", line 70, in dispatch_line if self.quitting: raise BdbQuit bdb.BdbQuit
2、示例2
QuickStart中使用的调试方式不够优雅,因为是通过修改代码的方式打断点的,用起来不太方便。
那么下面我们使用动态打断点的方式进行调试
1.代码示例 s1 = 'aaa' s2 = 'bbb' s3 = 'ccc' s = s1 + s2 + s3 print(s) 2.开始调试 1,在终端输入命令执行脚本文件:python -m pdb test2.py > d:\projects\pythonprojects\3.25pdb\test2.py(1)<module>() -> s1 = 'aaa' (Pdb) l 1 -> s1 = 'aaa' 2 s2 = 'bbb' 3 s3 = 'ccc' 4 s = s1 + s2 + s3 5 print(s) [EOF] 2,可以看到当前代码中我们还没有打任何断点,代码默认停在了第1行。 执行一个命令 n : (Pdb) n > d:\projects\pythonprojects\3.25pdb\test2.py(2)<module>() -> s2 = 'bbb' (Pdb) l 1 s1 = 'aaa' 2 -> s2 = 'bbb' 3 s3 = 'ccc' 4 s = s1 + s2 + s3 5 print(s) [EOF] 可以看到单步执行到了下一行。 3,如果我们想在第4行打一个断点,用 b <行号> 命令在某一行打一个断点: (Pdb) b 4 Breakpoint 1 at d:\projects\pythonprojects\3.25pdb\test2.py:4 (Pdb) n > d:\projects\pythonprojects\3.25pdb\test2.py(3)<module>() -> s3 = 'ccc' (Pdb) l 1 s1 = 'aaa' 2 s2 = 'bbb' 3 -> s3 = 'ccc' 4 B s = s1 + s2 + s3 5 print(s) [EOF] 这样就成功地在第4行打了一个断点。 4,查看当前打了哪些断点: b 命令 (Pdb) b Num Type Disp Enb Where 1 breakpoint keep yes at d:\projects\pythonprojects\3.25pdb\test2.py:4
四、补充
在命令行中进入调试模式的方法: python -m pdb demo.py
在调试模式中按一下 Enter 键表示执行一下上一条命令。