ipdb python调试工具
在三维点云中,各种矩阵的运算及输出需要多次调试才能够理解和更改,原来一直使用print大法,这样会导致手忙脚乱,而且很烦。现在有一个ipdb工具可以进行方便的调试,同时也不会显得特别蠢。。。。。
python 提供了一个默认的 debugger:pdb,而 ipdb 则是 pdb 的增强版,提供了补全、语法高亮等功能,类似于 ipython 与 python 默认的交互终端的关系,通过 pip install ipdb
即可安装 ipdb。
github地址 :github.com/gotcha/ipdb
pdb的官方网址 docs.python.org/3.5/library…
参考网址 wulc.me/2018/12/21/…
使用方式
ipdb 的使用方法一般有两种:集成到源代码或通过命令交互。
集成到源代码方式
集成到源代码可以直接在代码指定位置插入断点。
官方实例如下所示:
import ipdb
ipdb.set_trace()
ipdb.set_trace(context=5) # will show five lines of code
# instead of the default three lines
# or you can set it via IPDB_CONTEXT_SIZE env variable
# or setup.cfg file
ipdb.pm()
ipdb.run('x[0] = 3')
result = ipdb.runcall(function, arg0, arg1, kwarg='foo')
result = ipdb.runeval('f(1,2) - 3')
一个简单的例子如下所示
import ipdb
num=12
ipdb.set_trace()
其中,在执行完num=12 命令后,会暂停进入ipython环境调试
常用命令
ENTER
(重复上次命令)c
(继续)l
(查找当前位于哪里)s
(进入子程序)r
(运行直到子程序结束)!<python 命令>
h
(帮助)- a(rgs) 打印当前函数的参数
- j(ump) 让程序跳转到指定的行数
- l(ist) 可以列出当前将要运行的代码块
- n(ext) 让程序运行下一行,如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的
- p(rint) 最有用的命令之一,打印某个变量
- q(uit) 退出调试
- r(eturn) 继续执行,直到函数体返回
- s(tep) 跟 n 相似,但是如果当前有一个函数调用,那么 s 会进入被调用的函数体中
启动命令式
上面的方式虽然简单,但是存在着两个较为比较明显的问题:
- 插入的断点代码会污染原来的代码空间
- 每次插入断点都需要修改源码
因此,相比于上面的方式,交互式的命令式调试方法更加方便。启动命令式调试环境的方法也很简单:
python -m ipdb code.py
逐行执行
有两条命令可以进行逐行执行: s
(step) 或 n
(next), 两个命令的主要区别是:假如当前行调用了某个函数,s
会进入这个函数,n
则不会。因此,如果需要了解函数内部执行的细节,需要 s
命令进入函数内部进行 debug。
进入了函数之后,通过命令 a
(argument) 可列出当前的函数的参数,通过 r
(return)则可以直接执行至 return 语句。
忽略某段代码
使用 j line_number
可以忽略某段代码,下一步直接从 line_number 开始执行。
查看源码
通过命令 l
或 ll
可查看源码, ll
是查看整个源码文件, l
可指定需要查看的行数,默认是当前往后 11 行,也可指定具体的范围,如 l 2,5
是查看第 2-5 行的源码。
重启或退出 debugger
上面已经提到了重启 debugger 可通过 restart
或 run
命令,需要注意的是,**重启 debugger 后断点、debugger 的设置等是会保留的。**如果要一个全新的 debugger,可通过命令 q
、quit
或 exit
退出 debugger 后进入。