使用 pdb 来 debug 调试 python 程序
使用 pdb(Python Debugger)是 python 自带的,即内置的调试工具。调试 Python 源代码时,掌握基础命令和高级技巧可以大幅提高调试效率。以下是 全面的技术总结和高级技巧,涵盖从基础到进阶的调试方法。
被调试源码:
a.py
radius =1while radius < 4: area = 3.1415926 * radius**2print(f"radius is {radius}") print(f"circle area is {area}")radius += 1
1. 基础调试命令
(1) 使用 pdb
方式 1:命令行启动
$ python -m pdb a.py
程序会在第一行代码前暂停,进入调试模式。
注意:按照 python 的编程喜欢,这种方式简单,但不友好,会把import、def 都刷一遍,最后进入执行的代码处开始有价值的调试。
方式 2:代码中插入断点
import pdb; pdb.set_trace() # Python 3.7+
程序运行到该行时会暂停,进入调试模式。
注意:其中 pdb.set_trace() 一般插在源代码程序的功能性开头处
方式 3:breakpoint()(Python 3.7+)
breakpoint() # 等同于 import pdb; pdb.set_trace()
可以插入到功能性代码的开头一行
(2) 基本调试命令
命令 | 缩写 | 作用 |
help | h | 查看所有命令帮助 |
next | n | 执行下一行(不进入函数) |
step | s | 进入函数调用 |
continue | c | 继续执行直到下一个断点 |
list | l | 显示当前代码上下文 |
p | 打印变量值 | |
quit | q | 退出调试 |
return | r | 执行到当前函数返回 |
2. 高级调试技巧
(1) 条件断点
(Pdb) break filename.py:line_number, condition
示例:
(Pdb) break a.py:6, area > 5 # 当 area > 5 时在第 6 行暂停
(2) 查看调用栈(Backtrace)
(Pdb) where # 或 `bt`
显示当前调用栈,帮助定位问题来源。
这里的示例比较简单,没有step 进子函数中去,但也能看出系统自带的函数调用栈:
(3) 修改变量值
(Pdb) !x = 42 # 修改变量 x 的值
在调试过程中动态调整变量值。
(4) 执行任意 Python 代码
(Pdb) import math
(Pdb) p math.sqrt(16) # 计算并打印结果
可以在调试时执行任意 Python 表达式。
(5) 跟踪函数调用
(Pdb) display x # 每次执行命令后自动打印 x 的值
(Pdb) undisplay # 取消跟踪
3. 高级调试场景
(1) 调试异常
python -m pdb -c continue script.py
-c continue 让程序运行直到异常发生,然后进入调试模式。
(2) 调试多线程/多进程
import pdb
pdb.Pdb().set_trace() # 适用于子进程调试
在子进程中手动设置断点。
(3) 调试异步代码(Async/Await)
import pdb
pdb.set_trace() # 在 async 函数中使用
适用于 asyncio 调试。
4. 替代 pdb 的现代调试工具
工具 | 特点 |
ipdb | 基于 IPython 的增强版 pdb,支持 Tab 补全 |
pdb | 支持语法高亮、更好的 UI |
PyCharm Debugger | 图形化调试,支持条件断点 |
VS Code Debugger | 集成 IDE,可视化调试 |
汇个总
基础命令:n(next)、s(step)、c(continue)、p(print)、l(list)。
高级技巧:
条件断点 break filename:lineNumber , condition
调用栈分析 where / bt
动态修改变量 !x = 42
替代工具:ipdb、pdb++、PyCharm、VS Code。