在Python可使用一个叫pdb的模块用于调试代码;pdb模块为Python程序定义了一个交互式的源代码调试器,你可通过它设置断点、逐行执行、堆栈检查等等常用调试功能;

使用方法
你可通过使用pdb对整个脚本文件进行调试:

python -m pdb yourscript.py

也可在程序中添加以下代码为程序添加断点,使程序进入pdb调试器:

import pdb; pdb.set_trace()

在3.7版本中,新添加了一个内置函数breakpoint(),其效果等同于上述代码;

python pdb
当看到(Pdb)字样表示程序进入了pdb调试器;

pdb调试器命令
本文使用以下代码作为介绍pdb调试器的测试代码:

def add(a,b):
return a + b

x1 = 1
x2 = 2
breakpoint()
print(x1,x2,add(x1,x2))

将代码保存为main.py并在命令行使用python main.py运行,程序已设置断点,将进入pdb调试器模式;

在调试器中执行代码

你可以在pdb调试器中执行python代码,比如修改变量,调用函数,打印信息;

python pdb
进入pdb调试器后,除了执行python代码,还可使用某些命令对程序进行调试;下列命令中()部分表示为全称,且可省略;

查看帮助 h(elp) [command]

不带参数时,打印所有可用的命令;使用参数时,则显示该参数的完整文档;

python pdb help
打印堆栈跟踪信息 w(here)

打印一个堆栈跟踪信息;

python pdb where
设置断点 b(reak) [[filename:]lineno] | function]

如果不带参数,则列出所有中断;

如果参数是行号,则在当前文件中设置一个断点,如果指定了文件名,则在该文件的指定行设置一个断点,pdb调试器在sys.path中搜索该文件;

如果参数是函数名,则在该函数的起始位置设置中断;

设置临时断点 tbreak [[filename:]lineno] | function]

设置一个临时断点,命中一次时自动移除;参数于break命令相同;

清除断点 cl(ear) [filename:lineno | bpnumber [pbnumber …]]

不使用参数时,则清除所有断点,需要输入y或yes确认;

如果参数指定了文件名和行号,则清除该行断点;

如果参数是断点号(多个使用空格分开),则清除这些断点;断点号可使用b(reak)命令查看;

禁用断点 disable [bpnumber [bpnumber …]]

该命令会禁用断点号(多个断点号使用空格区分);禁用意味着该断点不再使程序停止执行,断点继续保留在断点列表中,可以使用enable命令重新启用;

启用断点 enable [bpnumber [bpnumber …]]

启用指定的断点,参数与disable命令相同;

忽略断点 ignore bpnumber [count]

给指定断点设置一个忽略计数,如果省略忽略计数,则忽略计数设置为0;

当忽略计数为0时,断点变为活动状态;当非0时,则计数在断点命中且未被禁用时递减;

继续执行 s(tep)

执行当前行,能够进入函数体;

python pdb step
继续执行 n(ext)

继续执行,但不会进入函数体;

继续执行 r(eturn)

继续执行,直到当前函数返回位置;

继续执行 unt(il) [lineno]

如果没有指定行号,则执行到大于当前行号的位置;

如果指定了行号(行号必须大于当前行号),则在指定行号或大于指定行号的地方停止;

继续执行 c(ont(inue))

继续执行,只在碰到断点的地方停止;

列出源码 l(ist) [first,last]]

如果没有指定参数,则列出当前行位置前后11行的代码;

如果指定了参数,则列出指定范围内的代码;例如:list 3,5 将列出第3行到第5行的代码;

列出所有源码 ll | longlist

列出当前文件或函数的所有源码;

打印当前函数的参数列表 a(rgs)

打印当前函数的参数列表:

python pdb args
打印表达式的值 p expression

结合上下文,评估表达式的值,并打印该值;

python pdb p
打印表达式的值 pp expression

该命令与p命令相似,只不过该命令对数据进行美化输出;

查看类型 whatis expression

查看表达式的数据类型;

python pdb whatis
显示源码 source expression

尝试获取指定表达式的源码并显示;

退出pdb调试器 q(quit)

退出调试器,正在运行的程序将被终止;