pdb 是 Python 内置的交互式调试器,名字来自 Python Debugger。它允许开发者在程序运行中设置断点、逐行执行代码、查看变量值、追踪调用栈,以便快速定位错误或理解代码执行流程。

相比于 print() 调试,pdb 提供了更强大、灵活、专业的调试手段。

常见应用场景:

(1)程序运行出现错误但信息不足,需进入断点调试。

(2)想在函数中查看变量的即时值或追踪其变化。

(3)需要逐行执行某段逻辑以观察流程。

(4)需要进入异常现场分析崩溃原因。

(5)替代 print 调试,提升开发效率。

◆ ◆

核心概念

1、set_trace()

通过 pdb.set_trace() 手动设置断点,程序运行到此处暂停,进入交互式调试。

import pdb

def test():
    a = 1
    pdb.set_trace()  # 设置断点
    b = 2
    print(a + b)

test()

运行程序后将在命令行进入调试状态,可输入 n(下一步)、p a(打印 a)等命令。

2、命令行调试入口

可在终端直接启动调试器:

python -m pdb your_script.py

适用于从第一行开始调试整个脚本。

3、post_mortem()

在程序出现未捕获异常后,调用 pdb.post_mortem() 可直接进入异常现场。

4、常用命令(记住几个即可)

l:列出当前代码(list)

n:执行下一行(next)

s:进入函数(step)

c:继续执行直到下一个断点(continue)

p 表达式:打印表达式结果

b 行号:设置断点

q:退出调试器

w:查看当前调用栈

◆ ◆

应用举例

例 1:基本断点调试

import pdb

def calc(x, y):
    pdb.set_trace()
    result = x * y
    return result

print(calc(3, 5))

运行后会暂停在 set_trace() 行,输入命令进行交互调试。

例 2:在异常发生后进入调试

import pdb

def divide(a, b):
    return a / b

try:
    divide(10, 0)
except Exception:
    pdb.post_mortem()  # 异常发生后进入调试

例 3:从命令行启动调试器

python -m pdb demo.py

适用于需要从头调试整个脚本的情况。

例 4:以函数调用方式启动调试

import pdb

def add(x, y):
    return x + y

result = pdb.runcall(add, 2, 3)
print(result)

例 5:执行多行代码调试

import pdb

code = """
a = 1
b = 2
print(a + b)
"""
pdb.run(code)

◆ ◆

常用函数速览

post_mortem(traceback=None)

在异常发生后进入调试器,用于分析错误现场。

参数

traceback:可选的 traceback 对象,默认使用 sys.last_traceback

返回:无

run(statement, globals=None, locals=None)

调试执行一个代码字符串。

参数

statement:待执行的 Python 代码(字符串形式)

globals:可选,全局变量字典

locals:可选,局部变量字典

返回:无

runcall(func, *args, **kwargs)

以调试模式调用某个函数。

参数

func:要调试执行的函数

*args:函数位置参数

**kwargs:函数关键字参数

返回:func 的返回值

runctx(statement, globals, locals)

在指定的上下文中调试执行一段代码。

参数

statement:代码字符串

globals:全局命名空间

locals:局部命名空间

返回:无

set_trace()

手动设置调试断点并暂停程序。

参数:无

返回:无

◆ ◆

补充说明

1、pdb 属于标准库,无需安装即可使用。

2、可与 IDE(如 PyCharm、VS Code)调试器配合使用。

3、不建议在生产环境代码中保留 set_trace() 或调试断点。

4、在类或模块中调试时,使用 p self、dir(self) 可快速了解对象状态。

5、使用 ! 可以执行 Python 表达式,如 !print(a)。

点赞有美意,赞赏是鼓励