pdb-The Python Debugger
简单记录一下
Table of Contents
pdb 里的一些方法
pdb.run(statement, globals=None, locals=None)pdb.runeval(expression, globals=None, locals=None)pdb.runcall(function, *args, **kwds)pdb.set_trace()pdb.post_mortem(traceback=None)pdb.pm()Enter post-mortem debugging of the traceback found in
最常使用的也就是 pdb.set_trace() 和 pdb.pm()
class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)
Example call to enable tracing with skip:
import pdb
pdb.Pdb(skip=['django.*']).set_trace()
debugger commands¶
输入 h(elp) 可以查看帮助信息,输入不是 pdb 指令时被认为是 Python 语句,这些语句会在当前的 debug point 执行,输入单个变量名则打印该变量。当变量名和 pdb 指令重名时,在变量名前添加 ! 如 !c。
如果命令带参数则使用 [] 指定,可选项使用 | 分开。多条命令可以单行输入,使用 ; 隔开
h(elp) [command]没有参数时,打印所有命令选项,带参数则打印此命令的帮助信息。w(here)打印当前的 debug pointd(own) [count]将当前的 frame 下移 count 个层级u(p) [count]上移b(reak) [([filename:]lineno | function) [, condition]]s(tep)单步调试n(ext)执行到当前文件中的下一行unt(il) [lineno]不给参数,继续执行到大于当前行号的地方;给参数则执行到大于给定行号的地方。对于两种方式,当前 frame 返回都会终止。r(eturn)继续执行直到当前函数 returnc(ont(inue))继续执行直到下一个断点l(ist) [first[, last]]列出区域源码,如果不给出参数,显示 11 行ll显示全部源码a(rgs)显示当前函数的参数列表whatis expression显示 typedisplay [expression]如果 expression 的值发生改变的话显示 expression 的值,如果不指定参数,列出全部 expressionundisplay [expression]不再显示interact开启一个 interactive crompt 当前 frame 中的所有 global 和 local 变量包含在新环境的 global 中! statement执行单行语句q退出 debugger 放弃执行当前程序,相当粗鲁,程序直接崩溃。
pdb++¶
pdb++ 是 Python pdb 的加强版,使用时与 pdb 完全兼容。
pdb++ 是一个 drop-in replacement,也就是说完全不需要更改原有的使用习惯,甚至直接使用 pdb 这一名称进行调用。
主要特性
- colorful TAB completion of Python expressions (through fancycompleter) 彩色 TAB 补全
- optional syntax highlighting of code listings (through pygments) 代码高亮
- sticky mode sticky 模式
- several new commands to be used from the interactive (Pdb++) prompt 一些新的调试命令
- smart command parsing (hint: have you ever typed r or c at the prompt to print the value of some variable?)
- additional convenience functions in the pdb module, to be used from your program
值得注意的是,在 pdb 中,c u d 等字母属于调试指令,所以要打印同名变量必须在前面加上转义符 !c,但是在 pdb++ 中,默认优先考虑变量,只要变量在当前 frame 中存在就默认打印变量,而如果不存在则考虑是否存在同名指令。
(Pdb) list
1
2 def fn():
3 c = 42
4 import pdb;pdb.set_trace()
5 -> return c
(Pdb) c
(Pdb++) list
1
2 def fn():
3 c = 42
4 import pdb;pdb.set_trace()
5 -> return c
(Pdb++) c
42
(Pdb++) !!c
存在同名变量时,要执行调试命令只能在前面添加两个 !! 比如 !!c
一些同名指令的输出结果也得到了加强,还有很多其他的改进,详见 References
References: