实际上ipdb是pdb的扩展版本,在pdb的基础上添加了如下功能:
u
也就是up ,回到上一层的帧栈 (对应的就是 d ) ,这在你进入到了一个exception的捕捉过程中的时候相当有用…
display var
var是我们要跟踪的变量,这样每次var变化的时候就会自动print出来
想取消就用undisplay var即可
p var
这个是我自己经常忘记,然后傻傻打print,实际上直接p命令就可以。另一方面也证明ipdb里面不仅可以输入ipdb的命令,还可以输入python的code进行实时编译和运行
bt/where 或者简写成 w
查看层叠帧栈
source function
查看 function的源代码
类似的还有pdoc var 查看var的文档(变量和函数都可以,有点像dir(var)命令)
pinfo var命令,可以看到var声明的源代码地址
ll命令也可以
j(jump)
修改CPU的下一条指令,会忽略中间的代码不去执行,也可以往回跳,只要你确认不会报错就可以
关于断点的:
1.b
查看断点有哪些(会用序号分别标出来)
gdb里面是info b 有点不大一样
2. cl idx
根据上一步输出的序号idx,可以删除你想删除的断点
gdb里面是del idx ,有点不大一样
3. disable idx & enable idx
根据命令1输出的序号idx,可以设置让该断点当前生效或者失效(如果直接删除代价太大了)
4. tbreak 添加临时断点(这次断完就会失效
tbreak line
tbreak file:line
import ipdb
ipdb.set_trace() #在你想要开始调试的地方写下这行就可以
然后在shell里面python xx.py或者直接 ./xxx.py也可
def f():
pass
ipdb.set_trace=f
利用函数覆盖
如果调试到一半又想要使用ipdb.set_trace()的功能怎么办(是的我们程序员就是事儿多)
reload ipdb 或者 del ipdb
原理可以参考我之前的blog xxx object is not callable可能的原因之一【恢复被覆盖的python内置函数】
比如说,想看xx小于0的时候是怎么个情况,就在它上次报错的后面加上:
if xx<0:
import ipdb
ipdb.set_trace()