python debug之ipdb

ipdb和pdb区别

实际上ipdb是pdb的扩展版本,在pdb的基础上添加了如下功能:

  • 可以使用tab(提示)补全代码的功能(我觉得这一点上我就完全倒戈了…)
  • 调试不再是黑白的,l命令可以输出带颜色的代码(将变量、命令、函数名等区分开,提高代码可读性)
    在这里插入图片描述
    就像这样,test.py(13)里面的13是当前行号
    左边的箭头表示你现在马上要运行的代码所在处
    最左列的红色的1和2代表你设置的断点


常用命令

  • 整理几个自己常用的:
    1. u
      也就是up ,回到上一层的帧栈 (对应的就是 d ) ,这在你进入到了一个exception的捕捉过程中的时候相当有用…

    2. display var
      var是我们要跟踪的变量,这样每次var变化的时候就会自动print出来
      想取消就用undisplay var即可

    3. p var
      这个是我自己经常忘记,然后傻傻打print,实际上直接p命令就可以。另一方面也证明ipdb里面不仅可以输入ipdb的命令,还可以输入python的code进行实时编译和运行

    4. bt/where 或者简写成 w
      查看层叠帧栈

    5. source function
      查看 function的源代码
      类似的还有pdoc var 查看var的文档(变量和函数都可以,有点像dir(var)命令)
      pinfo var命令,可以看到var声明的源代码地址
      ll命令也可以

    6. j(jump)
      修改CPU的下一条指令,会忽略中间的代码不去执行,也可以往回跳,只要你确认不会报错就可以

    7. 关于断点的:

    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




小trick

断点全局失效/生效
import ipdb
ipdb.set_trace()	#在你想要开始调试的地方写下这行就可以

然后在shell里面python xx.py或者直接 ./xxx.py也可

  • 如果单次想要让断点失效,但是又不想手动一个一个删除ipdb.set_trace()怎么办?
def f():
	pass

ipdb.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 ipdb
	ipdb.set_trace()



More

  • pudb 可视化调试比ipdb好,适合vim或者emacs开发,有IDE的话,做的效果会更好

你可能感兴趣的:(python)