python 调试工具pdb
# Python 调试工具 pdb
# 简介
pdb (Python Debugger) 是 Python 的标准调试器,它提供了一个交互式的调试环境,允许开发者在程序执行过程中暂停、检查变量、单步执行代码等。
# 基本用法
# 启动方式
# 方式1:在代码中插入断点
import pdb; pdb.set_trace()
# 方式2:命令行启动
python -m pdb script.py
1
2
3
4
5
2
3
4
5
# 主要特点
- 支持断点设置和管理
- 支持单步执行和跳转
- 支持变量查看和修改
- 支持调用栈查看
- 支持条件断点
# 常用命令
# 命令快速参考
| 命令 | 功能 | 说明 |
|---|---|---|
h(elp) | 显示帮助信息 | 查看所有可用命令 |
q(uit) | 退出调试器 | 完全退出pdb |
c(ontinue) | 继续执行到下一个断点 | 跳过当前断点继续执行 |
n(ext) | 逐行执行 | 执行下一行,不进入函数 |
s(tep) | 步入函数 | 进入函数内部执行 |
r(eturn) | 执行到函数返回 | 执行到当前函数结束 |
u(ntil) [行号] | 跳过断点执行到指定行 | 跳过中间的所有断点 |
j(ump) 行号 | 跳转到指定行 | 直接跳转到指定行号 |
l(ist) | 查看当前代码位置 | 显示当前行附近的代码 |
p 变量名 | 打印变量值 | 显示变量内容 |
pp 变量名 | 美化打印变量值 | 格式化显示变量 |
w(here) | 显示调用栈 | 查看函数调用链 |
a(rgs) | 显示当前函数的参数 | 查看函数参数 |
d(own) | 在调用栈中向下移动 | 查看更深层的调用 |
u(p) | 在调用栈中向上移动 | 查看更高层的调用 |
ll | 查看当前行号 | 查看当前行号 |
w(where) | 查看完整的调用堆栈 | 查看完整的调用堆栈 |
# 断点管理
| 命令 | 功能 | 示例 |
|---|---|---|
b(reak) 行号 | 在指定行设置断点 | b 15 |
b(reak) 文件名:行号 | 在指定文件行设置断点 | b main.py:20 |
b(reak) 函数名 | 在函数入口设置断点 | b process_data |
cl(ear) 断点号 | 删除特定断点 | cl 1 |
cl(ear) | 删除所有断点 | cl |
disable 断点号 | 禁用特定断点 | disable 1 |
enable 断点号 | 启用特定断点 | enable 1 |
# 高级用法
# 跳过多个断点
# 使用 until 命令
def process_data():
data = [1, 2, 3, 4, 5]
result = []
for i, item in enumerate(data):
# 断点1
import pdb; pdb.set_trace()
processed = item * 2
if processed > 5:
# 断点2
import pdb; pdb.set_trace()
result.append(processed)
return result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
调试命令:
(Pdb) until 15 # 跳过所有断点,直接执行到第15行
(Pdb) until # 跳过当前循环,执行到下一个循环迭代
1
2
2
# 使用 jump 命令
def complex_function():
x = 1
# 断点1
import pdb; pdb.set_trace()
y = x + 1
# 断点2
import pdb; pdb.set_trace()
z = y * 2
# 断点3
import pdb; pdb.set_trace()
return z
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
调试命令:
(Pdb) jump 20 # 直接跳转到第20行,跳过中间的断点
1
# 禁用特定断点
# 查看所有断点
(Pdb) b
# 禁用特定断点
(Pdb) disable 1 # 禁用断点1
(Pdb) disable 2 # 禁用断点2
# 然后使用 continue 命令
(Pdb) c
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 条件断点
def process_items(items):
for i, item in enumerate(items):
# 只在 i > 5 时触发断点
if i > 5:
import pdb; pdb.set_trace()
process_item(item)
1
2
3
4
5
6
2
3
4
5
6
# 实际调试示例
def debug_example():
data = list(range(10))
result = []
for i in data:
# 断点1:每次循环都会触发
import pdb; pdb.set_trace()
if i % 2 == 0:
# 断点2:只在偶数时触发
import pdb; pdb.set_trace()
result.append(i * 2)
return result
# 调试会话示例:
# (Pdb) until 15 # 跳过断点1,直接到第15行
# (Pdb) jump 20 # 跳转到第20行
# (Pdb) disable 1 # 禁用断点1
# (Pdb) c # 继续执行,只会在断点2处停止
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用场景
# 基本调试
def calculate_sum(numbers):
import pdb; pdb.set_trace() # 设置断点
total = 0
for num in numbers:
total += num
return total
1
2
3
4
5
6
2
3
4
5
6
# 条件调试
def process_data(data):
for item in data:
if item > 100: # 条件断点
import pdb; pdb.set_trace()
process_item(item)
1
2
3
4
5
2
3
4
5
# 函数调试
def complex_function():
# 在函数入口设置断点
import pdb; pdb.set_trace()
result = some_calculation()
return result
1
2
3
4
5
2
3
4
5
# 与日志结合
import logging
import pdb
logging.info("准备进入调试模式")
pdb.set_trace()
logging.info("调试结束")
1
2
3
4
5
6
2
3
4
5
6
# 最佳实践
# 使用建议
- 在关键代码点设置断点
- 使用有意义的变量名
- 调试完成后记得删除断点
- 使用条件断点减少不必要的暂停
# 注意事项
- 不要在生产环境中使用
- 注意内存使用
- 确保有适当的退出机制
- 避免在循环中设置过多断点
# 调试技巧
- 使用
dir()查看对象属性 - 使用
locals()查看局部变量 - 使用
globals()查看全局变量 - 使用
!执行 Python 代码 - 使用
run重新运行程序
# 常见问题
# 如何退出调试模式?
- 输入
q或quit - 按
Ctrl+D(Unix) 或Ctrl+Z(Windows)
# 如何查看变量值?
- 使用
p 变量名 - 使用
pp 变量名美化输出 - 直接输入变量名
# 如何执行代码?
- 使用
!执行 Python 代码 - 使用
run重新运行程序
# 与其他调试工具的比较
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| pdb | 轻量级、标准库、不依赖IDE | 功能相对简单 | 快速调试、简单问题排查 |
| embed() | 功能强大、支持IPython | 需要IPython、较重 | 复杂调试、数据分析 |
| 简单直接 | 功能有限、需要修改代码 | 简单变量查看 | |
| IDE调试器 | 图形界面、功能丰富 | 依赖特定IDE | 大型项目、团队开发 |
# 总结
pdb 是一个强大的调试工具,特别适合:
- 快速调试和问题排查
- 变量状态检查
- 代码执行跟踪
- 不依赖特定开发环境
记住: 调试完成后要及时清理代码,移除调试语句。
上次更新: 2025/10/09, 22:06:28