pudb使用
to be continued…
ipdb和pdb区别
实际上ipdb是pdb的扩展版本,在pdb的基础上添加了如下功能:
- 可以使用tab(提示)补全代码的功能(我觉得这一点上我就完全倒戈了…)
- 调试不再是黑白的,l命令可以输出带颜色的代码(将变量、命令、函数名等区分开,提高代码可读性)
就像这样,test.py(13)里面的13是当前行号
左边的箭头表示你现在马上要运行的代码所在处
最左列的红色的1和2代表你设置的断点
refer
- pdb调试多进程, actually 还是没有搞得很懂…
常用命令
- 整理几个自己常用的:
-
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
5. 条件断点
b [ [fileName:]lineNo [, condition] ]
e.g. b 5, flag==true
6. 另一个加断点的小trick
if( 你想要停下的判断条件 ):
ipdb.set_trace() -
小trick
使断点全局失效/生效
import ipdb
ipdb.set_trace() #在你想要开始调试的地方写下这行就可以
然后在shell里面python xx.py或者直接 ./xxx.py也可
- 如果单次想要让断点失效,但是又不想手动一个一个删除ipdb.set_trace()怎么办?
def f():passipdb.set_trace=f
利用函数覆盖
如果调试到一半又想要使用ipdb.set_trace()的功能怎么办(是的我们程序员就是事儿多)
reload ipdb 或者 del ipdb
原理可以参考我之前的blog xxx object is not callable可能的原因之一【恢复被覆盖的python内置函数】
想要监视某个变量的特殊情况
- condition BreakPointIndex expr
- 在那个出错的地方加上ipdb的set_trace
比如说,想看xx小于0的时候是怎么个情况,就在它上次报错的后面加上:
if xx<0:import ipdbipdb.set_trace()
- 如果想要实时关注或者盯着看某个变量的变化情况,使用watch或者display
More / 其他调试技巧
- pudb 可视化调试比ipdb好,适合vim或者emacs开发,有IDE的话,做的效果会更好
- 写了不少工具,但是tl;dr
dir()
-
查看当前内存中的变量
包括导入的包、创建的类 -
查看类的成员、方法
- dir ( GridMatrix )
- GridMatrix .__ dict__也可以查到(不过是以dict的形式返回)
key是这个成员变量或者函数的名字,value是这个成员函数的地址或者这个成员变量的值( 相当于key.__ str__的返回值)
可以通过GridMatrix .__ dict__[‘reset’]来查看GridMatrix 类reset成员函数的地址
添加包的搜索路径
https://www.jianshu.com/p/cb6447e1cf88
summary of the site link :
- change in codes(适合于一次性)
import sys
sys.path.append( str path )
- change system PYTHONPATH
- change python pkg