FreezeJ' Blog

python断点调试PDB

2020-09-28

代码部署到了服务器,不借助IDE很难调试,出现问题时,手动调试一个个变量print太麻烦,还需要频繁的改代码,效率低下,使用python PDB可以在命令行调试代码,非常强大

PDB是python debugger的简称,python默认已经自带pdb了,无需另外安装,以下是两种方式的PDB使用方式

单步执行模式

使用python3 -m pdb test.py启动脚本并进入单步执行模式,效果如下:
image.png

输入h可以看到pdb的帮助,也可以输入help xxx显示某个指令的帮助信息
image.png

以下是常用的命令介绍

命令 简写 作用
args a 查看当前函数参数
break b 不加数字查看断点,加数字表示在某一行打断点
clear cl 清除所有断点,加数字表示清除第几个断点
continue c 运行程序直至遇到下一个断点
disable 将指定的断点失效
display 一直显示变量的值
enable a 将指定的断点生效
help h 查看帮助
ignore 跳过断点n次
interact 进入包含当前环境变量的python解析器
jump j 跳转到程序指定行
list l 列出周围11行代码,list 1,6查看1到6行的代码
longlist ll 查看全部代码
next n 执行下一条语句(不进入函数)
p 输入表达式
pp 格式化输出表达式
quit q 退出调试
restart run 重新启动debug
return r 执行当前运行函数到结束
step s 执行下一条步(进入函数)
source 获取对象(方法、类等)的源码
undisplay 取消一直显示变量的值
until unt 执行直到某一行
whatis 输出变量类型
where w 打印当前执行堆栈

注意
1、直接输入Enter,会重复执行上一条命令
2、输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行
3、当前代码执行完后会从头开始重新执行debug

代码中嵌套set_trace()设置断点

直接在代码内需要加断点的行前面加入import pdb; pdb.set_trace(),正常运行代码,执行到该行就会进PDB命令行模式,调试方式与单步执行模式类似,但是这种方式运行到代码结束不会重新开始debug。

# test.py
import pdb
def t1(n):
    print(n)
a = 123
t1(a)
import pdb; pdb.set_trace()
print('done!')

image.png

参考资料
https://www.jb51.net/article/165206.htm
https://www.cnblogs.com/xiaohai2003ly/p/8529472.html