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: