debug with pdb

平常我是习惯使用IDE的断点功能的,但是有些情况下没有办法使用这种方式来进行调试,所以python原生提供的pdb就成为了一种不错的选择。下面我简单介绍一下pdb使用的方式。算是做一个总结,也方便自己以后忘了快速回忆。

breakpoint()

import numpy as np
 
for i in range(3):
    a = np.random.random((3, 3))
    breakpoint()

代码会在breakpoint()这里停下,控制台输出如下文字, 可以看到和gdb还是很像的

> ./test.py(3)<module>()
-> for i in range(3):
(Pdb) 

e开头的路径就是当前的python源代码文件,(3)代表你的程序停在第三行,<module> 就是你当前所在堆栈,要解释的也就这么多了。

基础命令

检视当前程序状态 :

  • print var (p var) :打印var变量
  • where (w) : 查看调用栈, 调用栈的顺序是由上至下,可以用 up(u)down(d) 自己所处的调用栈的位置
  • list (l) : 查看当前位置源代码,默认为前后共计11行,再次使用 l 命令会向下查看11行, 使用 l . 可以回到当前行
  • longlist (ll) : 查看当前函数全部代码

控制程序运行 :

  • next(n) : 执行下一行
  • step(s) : 步入式下一行
  • retval : 拿到当下一步到返回的时候, pdb会提示 --Return--,这时候我们可以用这个命令打印一下返回值
  • until(unt) num : 运行直到达到大于等于num行(如果这过程中碰到 breakpoint() 还是会停下来)
  • return (r) :运行到返回为止
  • continue (cont) :继续运行下去

pdb特性

In Python3.7, breakpoint() calls set_trace() internally to start the debugger. So just use breakpoint().

可以在debugger里运行任何python命令

  • break(b) num(function name) : pdb内设置断点, 当前文件的第num行停下来
  • quit(q) : 退出pdb

进阶命令

  • b num, condition : 条件断点