首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 调试工具 pdb

Python 调试工具 pdb

原创
作者头像
程序员余子越
修改2025-08-07 22:59:20
修改2025-08-07 22:59:20
34200
代码可运行
举报
运行总次数:0
代码可运行

调试代码是每个程序员都要面对的事,尤其是当代码跑起来莫名其妙出错的时候,Python 自带的调试工具 pdb 就是个救命神器!

它虽然没有图形化调试工具那么花哨,但简单好用,特别适合快速定位问题。这篇文章会带你从零开始,逐步搞懂 pdb 的用法,适合新手也能上手。

参考文章:Python 调试工具 pdb | 简单一点学习 easyeasy.me

1. 什么是 pdb?

pdb 是 Python 的内置调试模块,全称是 Python Debugger。它能让你在代码运行时暂停程序,检查变量值、逐步执行代码、甚至动态修改代码逻辑。不需要装啥额外的东西,Python 自带,随时可用。

pdb,你可以:

  • 在代码的任意位置设置断点
  • 一步步执行代码,观察每一步的变化
  • 检查和修改变量
  • 分析函数调用栈

2. 怎么启动 pdb?

有几种方法可以启动 pdb,咱们先从最简单的开始讲。

2.1 在代码里加断点

最直接的方式就是在代码里手动插入 pdb.set_trace(),程序运行到这行就会暂停,进入调试模式。比如:

代码语言:python
代码运行次数:0
运行
复制
def add_numbers(a, b):
    result = a + b
    import pdb; pdb.set_trace()  # 在这里暂停
    return result

print(add_numbers(3, 5))

运行这段代码,程序会在 pdb.set_trace() 处停下来,你会看到一个交互式提示符 (Pdb),可以开始输入调试命令了。

Python 3.7+ 的改进:从 Python 3.7 开始,你可以用更简单的 breakpoint() 函数代替 import pdb; pdb.set_trace(),效果一样:

代码语言:python
代码运行次数:0
运行
复制
def add_numbers(a, b):
    result = a + b
    breakpoint()  # 更简洁
    return result

print(add_numbers(3, 5))

2.2 命令行启动 pdb

如果你不想改代码,可以直接在命令行用 python -m pdb your_script.py 运行脚本。pdb 会从代码的第一行开始,进入调试模式。

比如,假设你有个脚本 script.py

代码语言:python
代码运行次数:0
运行
复制
def divide(a, b):
    result = a / b
    return result

print(divide(10, 0))  # 这里会出错

用命令行运行:

代码语言:bash
复制
python -m pdb script.py

程序会停在第一行,你可以用 n(下一行)或 s(步入函数)逐步执行,很快就能发现除零错误。

2.3 异常后进入 pdb

如果代码抛出异常,想直接跳到出错的地方调试,可以用 pdb.post_mortem()。不过更简单的方法是用 python -m pdb -c continue your_script.py,程序会在抛出异常时自动进入调试模式。

比如,运行上面的 script.py

代码语言:bash
复制
python -m pdb -c continue script.py

程序会在除零错误发生时停下来,进入 (Pdb) 模式,方便你检查变量和调用栈。

3. pdb 的核心命令

进入 pdb 后,你会看到 (Pdb) 提示符,输入命令来控制程序。以下是最常用的命令,建议边学边试!

命令

缩写

功能

next

n

执行下一行代码(不进入函数内部)

step

s

进入函数内部,逐步执行

continue

c

继续运行,直到下一个断点或程序结束

break

b

设置断点,比如 b 10 在第10行设断点

print

p

打印变量值,比如 p my_var

list

l

显示当前代码的上下文

where

w

显示调用栈

return

r

运行到当前函数返回

quit

q

退出调试

示例:逐步调试

看个例子,假设有以下代码:

代码语言:python
代码运行次数:0
运行
复制
def calculate_average(numbers):
    total = sum(numbers)
    count = len(numbers)
    breakpoint()
    average = total / count
    return average

numbers = [1, 2, 3, 0, 5]
print(calculate_average(numbers))

运行后,程序会在 breakpoint() 暂停。你可以:

  1. 输入 p total 查看 total 的值
  2. 输入 p count 查看 count 的值
  3. 输入 n 执行下一行
  4. 输入 c 继续运行

如果 numbers 是个空列表,count 会是 0,average = total / count 会抛出除零错误。调试时你就能提前发现这个问题。

4. 设置断点

手动加 breakpoint() 虽然简单,但如果想动态设置断点,可以在 (Pdb) 模式下用 break 命令。

4.1 在指定行设置断点

代码语言:bash
复制
(Pdb) b 10  # 在第10行设置断点

4.2 在函数设置断点

代码语言:bash
复制
(Pdb) b my_function  # 在 my_function 函数入口设置断点

4.3 查看所有断点

代码语言:bash
复制
(Pdb) b  # 列出所有断点

4.4 删除断点

代码语言:bash
复制
(Pdb) clear 1  # 删除编号为1的断点

例子:

代码语言:python
代码运行次数:0
运行
复制
def process_data(data):
    result = []
    for item in data:
        result.append(item * 2)
    breakpoint()
    return result

data = [1, 2, 3]
print(process_data(data))

运行后,在 (Pdb) 模式下输入 b process_data 可以在函数入口再加一个断点,然后用 c 运行到下一个断点。

5. 检查和修改变量

调试时,检查变量值是核心操作。可以用 p 命令打印变量,也可以用 ! 执行 Python 表达式来修改变量。

示例:检查和修改

代码语言:python
代码运行次数:0
运行
复制
def modify_list(items):
    breakpoint()
    items.append(100)
    return items

my_list = [1, 2, 3]
print(modify_list(my_list))

(Pdb) 模式下:

  • 输入 p items 查看 items 的值,应该是 [1, 2, 3]
  • 输入 !items.append(999) 动态添加一个元素
  • 输入 p items 再检查,变成 [1, 2, 3, 999]
  • 输入 c 继续运行

6. 高级技巧

6.1 条件断点

想在特定条件下暂停? forsale

代码语言:bash
复制
(Pdb) b 10, my_var > 5  # 当 my_var > 5 时在第10行暂停

6.2 在循环中调试

循环里调试很容易迷失方向,建议用 list 命令多看看上下文,或者用 where 检查调用栈。比如:

代码语言:python
代码运行次数:0
运行
复制
def sum_squares(n):
    total = 0
    for i in range(n):
        total += i * i
        breakpoint()
    return total

print(sum_squares(5))

(Pdb) 下:

  • p i 查看当前循环的 i
  • p total 查看累加的结果
  • n 逐步执行循环体

6.3 保存和加载调试命令

如果调试命令很多,可以保存到文件里:

代码语言:bash
复制
(Pdb) commands 1
(com) p my_var
(com) c
(end)

保存后可以用 source filename 加载这些命令。

7. 实际案例:调试一个复杂函数

来看个稍微复杂的例子:

代码语言:python
代码运行次数:0
运行
复制
def process_student_scores(scores):
    total = 0
    count = 0
    for score in scores:
        if score >= 60:
            total += score
            count += 1
    breakpoint()
    average = total / count if count > 0 else 0
    return average

scores = [85, 90, 55, 70, 0]
print(process_student_scores(scores))

运行后,程序在 breakpoint() 暂停。你可以:

  1. p scores 检查输入的成绩列表
  2. p totalp count 检查累加值和计数
  3. n 逐步执行,观察 average 计算
  4. 如果 scores 为空列表,count 会是 0,调试时就能发现潜在的除零错误

8. 一些实用建议

  • 多用 list where:调试时很容易迷失在代码里,这两个命令能帮你搞清楚“现在在哪”。
  • 善用条件断点:循环或复杂逻辑里,条件断点能省不少时间。
  • 别忘了 ! 修改变量:动态改变量值能帮你快速验证假设。
  • 调试后清理断点:用 clear 删掉不再需要的断点,避免以后运行干扰。

9. 局限性和替代工具

pdb 虽然好用,但也有局限:

  • 界面是纯文本的,不够直观
  • 多线程或异步代码调试支持有限

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是 pdb?
  • 2. 怎么启动 pdb?
    • 2.1 在代码里加断点
    • 2.2 命令行启动 pdb
    • 2.3 异常后进入 pdb
  • 3. pdb 的核心命令
    • 示例:逐步调试
  • 4. 设置断点
    • 4.1 在指定行设置断点
    • 4.2 在函数设置断点
    • 4.3 查看所有断点
    • 4.4 删除断点
  • 5. 检查和修改变量
    • 示例:检查和修改
  • 6. 高级技巧
    • 6.1 条件断点
    • 6.2 在循环中调试
    • 6.3 保存和加载调试命令
  • 7. 实际案例:调试一个复杂函数
  • 8. 一些实用建议
  • 9. 局限性和替代工具
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档