使用pdb模块调试Python程序实例
当 Python 代码出现非语法类的逻辑偏差或变量未达预期时,仅靠 print 已不够高效。借助标准库自带的 pdb 调试器,开发者能够利用多种入口函数拦截执行流,并通过交互式命令单步跟踪、监测变量与灵活调度断点,从而彻底理清运行时数据流向。
pdb 基础与启动方式
pdb(Python Debugger)是 Python 标准库自带的交互式调试器。它支持设置断点、单步执行、查看变量值以及动态修改运行状态。除在脚本中直接导入模块外,也完全可以通过命令行参数启动:
python -m pdb your_script.py
常用调试入口函数
第1步:使用 pdb.run() 调试语句块
目的:在不修改源文件的情况下,临时调试一段以字符串形式传入的代码。入口为模块级函数,适用于测试片段逻辑。
import pdb
pdb.run('''
for i in range(3):
i *= 3
print(i)
''', globals=globals(), locals=locals())
参数说明:`statement` 为待执行的字符串代码;`globals` 和 `locals` 可选,用于指定全局与局部命名空间。执行后进入 (Pdb) 提示符,输入 n 单步执行,c 继续运行。
第2步:使用 pdb.runeval() 调试表达式
目的:针对单一表达式进行求值过程中的断点监控。常用于验证复杂计算或索引访问结果。
import pdb
lst = [1, 2, 3]
pdb.runeval('lst[1]')
该函数同样接受 `expression` 字符串参数。调试器会在表达式求值完成后返回,可通过 n 命令观察返回值并退出当前作用域。
第3步:使用 pdb.runcall() 调试函数调用
目的:在进入目标函数内部前暂停,便于检查传入参数与初始执行状态。
import pdb
def sum_values(*args):
res = 0
for arg in args:
res += arg
return res
pdb.runcall(sum_values, 1, 2, 3, 4)
参数 `*args` 和 `**kwds` 对应实际函数签名。调用后将在函数首行中断,可使用 print(res) 或 p res 查看变量。
第4步:在脚本中插入硬断点 pdb.set_trace()
目的:在特定代码位置永久挂起程序,是最常用的嵌入式调试方式。
# test.py
import pdb
pdb.set_trace()
for i in range(5):
i *= 5
print(i)
运行 python test.py 后,程序会自动停在 pdb.set_trace() 下一行。此时键入 l 可列出上下文代码,c 继续执行至文件末尾或下一个断点。
核心交互调试命令
进入 (Pdb) 提示符后,可使用以下常用指令控制执行流与数据观测:
n/next:执行下一行代码,不进入当前行的子函数。s/step:执行下一行代码,如果该行是函数调用则进入函数内部。c/continue:继续运行直到遇到下一个断点或程序结束。r/return:一直运行到当前函数返回。b/break:设置断点,支持b 行号或b 函数名。cl/clear:清除所有断点,需输入y确认。disable与enable:禁用或启用特定编号的断点。p/print:打印指定变量或表达式的值。l/list:列出当前调试位置的源码清单(默认前后各5行)。q/quit:退出调试器并终止程序。
实战:命令行交互式调试完整流程
假设存在检测素数的脚本 prime.py,可通过命令行模式逐步排查逻辑。
# -*- coding: utf-8 -*-
import math
def isprime(i):
for t in range(2, int(math.sqrt(i)) + 1):
if i % t == 0:
return 0
return 1
print('100~110之间素数有: ')
for i in range(100, 110):
if isprime(i):
print(i)
在终端执行 python -m pdb prime.py 后,按顺序操作:
- 输入
b 14在第 14 行(循环开始处)设置断点。 - 输入
c继续运行,程序命中断点后暂停。再次输入c触发函数isprime调用,可在函数内部检查循环变量。 - 输入
l 14,17查看第 14 至 17 行源码确认缩进与逻辑。 - 输入
p i打印当前迭代的数值(如100)。 - 使用
disable 2临时关闭某断点,调试结束后输入cl清理环境。 - 最后输入
c跑完剩余逻辑,得到素数列表输出,随后键入q退出。
通过上述命令组合,无需打断生产环境即可精准追踪变量流转与条件分支走向。以上就是 pdb 模块调试 Python 程序的详细内容,更多关于 Python 进阶调试技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









