万物之中, 希望至美.

优秀的调试工具:ipdb

2019.09.19

ipdb(IPython debugger), 与 pdb 类似, 是一款集成了 IPython 的 Python 代码命令行调试工具,支持 Tab 键补全语法高亮等。

安装

ipdb 是 Python 的第三方库,使用 pip 即可安装

pip install ipdb

使用

与 pdb 类似, ipdb 的使用主要分为两种方式:

集成到代码中

在调试位置插入断点即可。如下所示:

x = 1
import ipdb; ipdb.set_trace();
y = 2

程序会在执行完 x = 1 这条语句之后停下来, 并展开 IPython 环境, 此时就可以进行调试了。

命令式

将 ipdb 集成到代码中很方便,但是也有不灵活的缺点。对于一段比较棘手的代码,我们可能需要按步执行,边运行边跟踪代码流并进行调试,这时候使用交互式的命令式调试方法更加有效。启动 ipdb 调试环境的方法也很简单:

python -m ipdb your_code.py

常用命令

ipdb 的命令与 pdb 命令差不多┑( ̄Д  ̄)┍

帮助

使用 h 即可调出 ipdb 的帮助。可以使用 help command 的方法查询特定命令的具体用法。

执行下一条语句

使用 n(next) 执行下一条语句。

注意: 一个函数调用也是一个语句。

进入函数内部

使用 s(step into) 进入函数调用的内部。

打断电

使用 b line_number(break) 的方式给指定的行号位置加上断点。使用 b file_name:line_number 的方法给指定的文件(还没执行到的代码可能在外部文件中)中指定行号位置打上断点。

继续执行到下一个断点处

使用 c(continue) 执行代码到下一个断点处或将程序执行完毕。

继续执行直到返回

使用 r(return) 执行代码直到当前所在的这个函数返回。

跳过某段代码

使用 j line_number(jump)可以跳过某段代码,直接执行指定行号所在的代码。

更多的上下文

在 ipdb 调试环境中,默认只显示当前执行的代码行,以及其上下各一行的代码。如果想要看到更多的上下文代码,可以使用 l first[, second](list)命令。

其中 first 指向上最多显示的行号,second 指向下最多显示的行号(可以省略)。当 second 小于 first 时,second 指的是从 first 开始的向下的行数(相对值 vs 绝对值)。

另外, 还可以通过修改 ipdb 的源码,一劳永逸的改变上下文的行数。可以看这篇文章: How can I make ipdb show more lines of context while debugging?

我在哪

有时我们可能会忘了自己目前所在的行号。例如在打印了若干变量值后,屏幕完全被这些值占据。使用 w 或者 where 可以打印出目前所在的行号位置以及上下文信息。

这是啥

可以使用 whatis variable_name 的方法,查看变量的类别(感觉有点鸡肋,用 type 也可以办到)。

列出当前函数的全部参数

当调试到一个函数内部的时候,可以使用 a(argument) 打印出传入函数的所有参数的值。

打印

使用 p(print) 和 pp(pretty print) 可以打印表达式的值。

清除断点

使用 cl 或者 clear file:line_number 清除断点。如果没有参数,则清除所有断点。

再来一次

使用 restart 重新启动调试器,断点等信息都会保留。restart 实际是 run 的别名,使用 run args 的方式传入参数。

退出

使用 q 退出调试,并清除所有信息。

这并不是 ipdb 的全部, 其他的命令还请参照帮助文档。

comments powered by Disqus