原文:https://xmfbit.github.io/2017/08/21/debugging-with-ipdb/python
IPDB是什么?IPDB(Ipython Debugger),和GDB相似,是一款集成了Ipython的Python代码命令行调试工具,能够看作PDB的升级版。这篇文章总结IPDB的使用方法,主要是若干命令的使用。更多详细的教程或文档还请参考Google。git
IPDB以Python第三方库的形式给出,使用pip install ipdb
便可轻松安装。github
在使用时,有两种常见方式。函数
经过在代码开头导入包,能够直接在代码指定位置插入断点。以下所示:工具
1
2
3
4
5
6
|
import ipdb
# some code
x =
10
ipdb.set_trace()
y =
20
# other code
|
则程序会在执行完x = 10
这条语句以后中止,展开Ipython环境,就能够自由地调试了。spa
上面的方法很方便,可是也有不灵活的缺点。对于一段比较棘手的代码,咱们可能须要按步执行,边运行边跟踪代码流并进行调试,这时候使用交互式的命令式调试方法更加有效。启动IPDB调试环境的方法也很简单:命令行
1
|
python -m ipdb your_code.py
|
IPDB调试环境提供的常见命令有:debug
帮助文档就是这样一个东西:当你写的时候以为这TM也要写?当你看别人的东西的时候以为这TM都没写?调试
使用h
便可调出IPDB的帮助。可使用help command
的方法查询特定命令的具体用法。rest
使用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绝对值)。
根据SO上的这个问题,你还能够修改IPDB的源码,一劳永逸地改变上下文的行数。
调试兴起,可能你会忘了本身目前所在的行号。例如在打印了若干变量值后,屏幕彻底被这些值占据。使用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的所有。其余的命令还请参照帮助文档。文档在手,天下我有!