使用IPDB调试Python代码

前些天在DSW里面调模型的代码实在是难受,tensorflow的报错真是个谜,一开始说我embedding索引越界,后面又说模型无法计算最终输出,最后经过几天的挣扎终于跑了起来,才发现就是输入的维度不对。这也就反映出了在DSW或者类似jupyter的代码编辑器中调试的困难,每次我想要查看变量的维度啊、值啊就非常麻烦,没有断点只能靠print大法,print大法其实用着也方便就是麻烦。刚好昨天晚上阿东告诉我了一个nb的python调试工具,在jupyter中非常好用!

ipdb文档
参考博文

命令式

对于一段比较棘手的代码,我们可能需要按步执行,边运行边跟踪代码流并进行调试,这时候使用交互式的命令式调试方法更加有效。启动IPDB调试环境的方法也很简单:

python -m ipdb your_code.py

在源代码中进行调试

我们也可以在源代码中进行调试,这可能是我最常用的。

import ipdb
# some code
x = 10
ipdb.set_trace()    # 设置断点
y = 20
# other code

一些常用操作

设置断点

ipdb.set_trace()

查看帮助文档

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

运行下一行

n(next)

步入

s(step into)

打印当前变量的值或表达式的值

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

打印变量类型

whatis + 变量名

查看当前你在第几行

w(where)

查看上下文代码

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

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

列出当前函数的全部参数

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

再来一次

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

退出

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

一直执行直到遇到下一个断点

使用c(continue)执行代码直到遇到某个断点或程序执行完毕。

一直执行直到返回

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

跳过某段代码

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

打断点

使用b line_number(break)的方式给指定的行号位置加上断点。使用b file_name:line_number的方法给指定的文件(还没执行到的代码可能在外部文件中)中指定行号位置打上断点。
另外,打断点还支持指定条件下进入,可以查询帮助文档。

发表回复

您的电子邮箱地址不会被公开。