PDB(Python Debugger)是 Python 内置的标准调试器,无需安装任何第三方包即可使用。本文将全面介绍 PDB 的使用方法,帮助你快速定位和解决 Python 代码中的问题。
1. 为什么需要调试器?
在编写 Python 代码时,你可能遇到过:
• 程序崩溃,但不知道具体是哪一行出错
• 变量值不符合预期,难以追踪问题根源
• 复杂逻辑难以理解,执行流程不清晰
这时,一个强大的调试器就能派上用场。PDB 作为 Python 标准库的一部分,提供了完整的调试功能。
2. 启动 PDB 的几种方式
2.1 命令行启动(最常用)
Bash python -m pdb your_script.py
|
程序会在第一行代码处暂停,进入调试模式。
2.2 在代码中设置断点
在需要暂停的位置添加:
Python import pdb # Python 3.7+ 也可以直接用 pdb.set_trace()
def calculate(a, b): result = a + b pdb.set_trace() # 程序运行到这里会暂停 return result * 2
print(calculate(5, 3))
|
2.3 Post-Mortem 调试(事后调试)
当程序崩溃后,使用 pm() 进入调试:
Python # 程序崩溃后 import pdb pdb.pm()
|
或者直接对异常使用 post-mortem:
Python import pdb import traceback
try: # 可能出错的代码 result = 1 / 0 except Exception: traceback.print_exc() pdb.post_mortem()
|
2.4 使用 runcall() 运行函数
Python import pdb
def add(a, b): return a + b
pdb.runcall(add, 3, 5)
|
3. 常用调试命令一览
进入 PDB 后,你会看到 (Pdb) 提示符。以下是高频使用的命令:
命令 | 简写 | 说明 |
next | n | 执行下一行代码(不进入函数) |
step | s | 执行下一行代码(进入函数) |
continue | c | 继续执行到下一个断点 |
quit / exit | q | 退出调试器 |
print | p | 打印变量值 |
list | l | 查看当前代码上下文 |
where | w | 显示当前堆栈位置 |
up | u | 移动到上层堆栈 |
down | d | 移动到下层堆栈 |
break | b | 设置断点 |
clear | cl | 清除断点 |
help | h | 查看帮助 |
3.1 查看代码:l(ist)
Bash (Pdb) l # 显示当前行前后的代码(默认 11 行)
(Pdb) l 1, 20 # 显示第 1 到 20 行
|
3.2 打印变量:p
Bash (Pdb) p variable_name # 打印变量值
(Pdb) p locals() # 打印所有局部变量
(Pdb) p globals() # 打印全局变量
|
�� 小技巧:除了 p,你也可以直接输入变量名查看其值。
3.3 单步执行:s(tep) vs n(ext)
Bash (Pdb) s # step - 进入函数内部 (Pdb) n # next - 跳过函数,直接执行完当前函数
|
3.4 堆栈导航:u(p) / d(own)
Bash (Pdb) w # where - 查看当前位置 (Pdb) u # up - 回到上层调用 (Pdb) d # down - 回到下层调用
|
4. 断点的高级用法
4.1 设置断点
Bash (Pdb) b 10 # 在第 10 行设置断点 (Pdb) b function_name # 在函数第一行设置断点 (Pdb) b other_file.py:5 # 在其他文件设置断点
|
4.2 条件断点
Bash (Pdb) b 10, x > 5 # 当 x > 5 时才在第 10 行暂停
|
4.3 临时断点(只触发一次)
4.4 管理断点
Bash (Pdb) b # 查看所有断点 (Pdb) cl 1 # 删除编号为 1 的断点 (Pdb) cl # 清除所有断点 (Pdb) disable 1 # 禁用断点 1 (Pdb) enable 1 # 启用断点 1
|
4.5 断点命令自动化
可以为断点绑定自动执行的命令:
Bash (Pdb) commands 1 (com) p some_variable (com) continue (com) end
|
5. 执行流程控制
5.1 跳转执行:j(ump)
Bash (Pdb) j 15 # 跳转到第 15 行执行
|
⚠️ 注意:jump 不能跳到循环体外或已经执行的代码块中。
5.2 继续执行到指定行:until
Bash (Pdb) until 20 # 继续执行直到第 20 行
|
6. 动态执行代码
在调试过程中,你可以直接执行 Python 代码:
Bash (Pdb) !x = 10 # 修改变量值 (Pdb) !my_func() # 调用函数 (Pdb) !import os; os.system('ls') # 执行任意 Python 语句
|
7. 实用技巧
7.1 使用 .pdbrc 配置文件
在 home 目录或当前目录创建 .pdbrc 文件,可以自动加载常用配置和别名:
Bash # ~/.pdbrc # 设置默认显示行数 alias s s alias n n
# 常用断点 break my_function
|
7.2 在 VS Code / PyCharm 中使用 PDB
现代 IDE 都支持将 PDB 作为默认调试器,体验更好(断点可视化、变量查看面板等)。
7.3 调试与日志结合
Python import pdb
def complex_function(data): for item in data: pdb.set_trace() # 逐个调试 # 处理逻辑... result = process(item) return results
|
7.4 优雅地处理循环中的调试
Python import pdb
for i in range(100): pdb.set_trace() if i 49 else None # 只在第 50 次暂停 # 或者用条件断点:b 10, i 49
|
8. 快速命令参考卡
Plain Text ┌─────────────────────────────────────────────────────────┐ │ PDB 快速命令参考 │ ├─────────────────────────────────────────────────────────┤ │ 启动方式 │ │ ───────────────────────────────────────────────────── │ │ python -m pdb script.py # 命令行启动 │ │ pdb.set_trace() # 代码中嵌入 │ │ pdb.pm() # 崩溃后调试 │ ├─────────────────────────────────────────────────────────┤ │ 基本操作 │ │ ───────────────────────────────────────────────────── │ │ n / next 执行下一行(不进入函数) │ │ s / step 执行下一行(进入函数) │ │ c / continue 继续执行到下一断点 │ │ q / quit 退出调试 │ ├─────────────────────────────────────────────────────────┤ │ 查看与导航 │ │ ───────────────────────────────────────────────────── │ │ l / list 查看当前代码 │ │ w / where 查看调用堆栈 │ │ u / up 回到上层堆栈 │ │ d / down 回到下层堆栈 │ │ p var 打印变量值 │ ├─────────────────────────────────────────────────────────┤ │ 断点管理 │ │ ───────────────────────────────────────────────────── │ │ b lineno 设置断点 │ │ b func 在函数处设置断点 │ │ b line, cond 条件断点 │ │ cl 清除所有断点 │ │ cl num 清除指定编号断点 │ │ disable/enable 禁用/启用断点 │ └─────────────────────────────────────────────────────────┘
|
9. 总结
PDB 是 Python 开发者必备的调试工具,功能强大且无需额外安装。掌握以下核心技能即可应对大部分调试场景:
1. 启动:python -m pdb 或 pdb.set_trace()
2. 单步:n(过函数)和 s(进函数)
3. 断点:b 设置,c 继续
4. 查看:l 看代码,p 看变量
5. 条件断点:精准控制调试位置
对于更复杂的调试需求,可以考虑 ipdb(IPython 增强版)或 IDE 内置调试器,它们提供更友好的交互界面。
Happy Debugging!