Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • python 学习指南
  • python 中的设计模式
  • module

  • tool

    • python 虚拟环境
    • python 调试工具embed
    • python 调试工具pdb
      • 简介
      • 基本用法
        • 启动方式
        • 主要特点
      • 常用命令
        • 命令快速参考
        • 断点管理
      • 高级用法
        • 跳过多个断点
        • 使用 until 命令
        • 使用 jump 命令
        • 禁用特定断点
        • 条件断点
        • 实际调试示例
      • 使用场景
        • 基本调试
        • 条件调试
        • 函数调试
        • 与日志结合
      • 最佳实践
        • 使用建议
        • 注意事项
        • 调试技巧
      • 常见问题
        • 如何退出调试模式?
        • 如何查看变量值?
        • 如何执行代码?
      • 与其他调试工具的比较
      • 总结
    • python 包管理器 pip
    • pyenv 好用的python版本管理工具
  • other

  • 《python》
  • tool
Jacky
2025-06-05
目录

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

# 主要特点

  • 支持断点设置和管理
  • 支持单步执行和跳转
  • 支持变量查看和修改
  • 支持调用栈查看
  • 支持条件断点

# 常用命令

# 命令快速参考

命令 功能 说明
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

调试命令:

(Pdb) until 15  # 跳过所有断点,直接执行到第15行
(Pdb) until     # 跳过当前循环,执行到下一个循环迭代
1
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

调试命令:

(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

# 条件断点

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

# 实际调试示例

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

# 使用场景

# 基本调试

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

# 条件调试

def process_data(data):
    for item in data:
        if item > 100:  # 条件断点
            import pdb; pdb.set_trace()
        process_item(item)
1
2
3
4
5

# 函数调试

def complex_function():
    # 在函数入口设置断点
    import pdb; pdb.set_trace()
    result = some_calculation()
    return result
1
2
3
4
5

# 与日志结合

import logging
import pdb

logging.info("准备进入调试模式")
pdb.set_trace()
logging.info("调试结束")
1
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、较重 复杂调试、数据分析
print 简单直接 功能有限、需要修改代码 简单变量查看
IDE调试器 图形界面、功能丰富 依赖特定IDE 大型项目、团队开发

# 总结

pdb 是一个强大的调试工具,特别适合:

  • 快速调试和问题排查
  • 变量状态检查
  • 代码执行跟踪
  • 不依赖特定开发环境

记住: 调试完成后要及时清理代码,移除调试语句。

#Python#调试#pdb
上次更新: 2025/10/09, 22:06:28
python 调试工具embed
python 包管理器 pip

← python 调试工具embed python 包管理器 pip→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式