在Python可使用一个叫pdb的模块用于调试代码;pdb模块为Python程序定义了一个交互式的源代码调试器,你可通过它设置断点、逐行执行、堆栈检查等等常用调试功能;
使用方法
你可通过使用pdb对整个脚本文件进行调试:
也可在程序中添加以下代码为程序添加断点,使程序进入pdb调试器:
import pdb; pdb.set_trace()
在3.7版本中,新添加了一个内置函数breakpoint(),其效果等同于上述代码;
python pdb
当看到(Pdb)字样表示程序进入了pdb调试器;
pdb调试器命令
本文使用以下代码作为介绍pdb调试器的测试代码:
将代码保存为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)
退出调试器,正在运行的程序将被终止;