多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 9.5 【调试技巧】使用 PDB 进行无界面调试 Pycharm 的图形化界面虽然好用,但是在某些场景中,是无法使用的。而 Python 本身已经给我们提供了一个调试神器 -- pdb,可能你还不知道它,为了讲解这个神器,我写了这篇文章来帮助你轻松的理解它。 ## 1. 准备文件 在调试之前先将这两个文件准备好(做为演示用),并放在同级目录中。 `utils.py` ```python def sum(mylist): result = 0 for item in mylist: result += item return result ``` `pdb_demo.py` ```python import utils def myfunc(mylist): result = utils.sum(mylist) print(result) if __name__ == '__main__': print("----start----") myfunc([1,2,3,4]) print("----end-----") ``` ## 2. 进入调试模式 主要有两种方法 做为脚本调用,方法很简单,就像正常执行python脚本一样,只是多加了`-m pdb` ``` ptyhon -m pdb pdb_demo.py ``` 使用这个方式进入调试模式,会在脚本的第一行开始单步调试。 ![](http://image.iswbm.com/20190118000111.png) 对于单文件的脚本并没有什么问题,如果是一个大型的项目,项目里有很多的文件,使用这种方式只能大大降低我们的效率。 一般情况下,都会直接在你需要的地方打一个断点,那如何打呢? 只需在你想要打断点的地方加上这两行。 ```python import pdb pdb.set_trace() ``` 然后执行时,也不需要再指定`-m pdb`了,直接`python pdb_demo.py ` ,就会直接在这个地方暂停。 ![](http://image.iswbm.com/20190118000234.png) ![](http://image.iswbm.com/20190118000557.png) ## 3. 调试指令 熟悉 Pycharm 的人都知道,我们执行下一步,执行到下一个断点是 同样的,pdb 也需要你更多记这样的命令。 当你看到pdb模式的标识符 `(Pdb)`时,就可以输入这样的命令。 我在这里将这些指令按使用频度分为三个等级。 **最常用** | 指令 | 英文 | 解释 | | :--: | :-------: | :----------------------: | | n | Next | 下一步 | | l | list | 列出当前断点处源码 | | p | print | 打印变量 | | s | step into | 执行当前行,可以进入函数 | | r | return | 运行完当前函数,返回结果 | | c | continue | 执行到下一断点或者结束 | | b | break | 设置断点 | | q | quit | 退出程序 | **有时使用** | 指令 | 英文 | 解释 | | :---------: | :------: | :--------------------------: | | a | args | 列出当前函数的参数 | | pp | pprint | 一种可视化更好的打印 | | j | jump | 跳到指定行 | | cl | clear | 清除断点 | | w | where | 打印当前堆栈 | | u | up | 执行跳转到当前堆栈的上一层 | | unt | until | 行数递增执行(忽略循环和函数) | | ll | longlist | 列出更多的源码 | | run/restart | run | 重新启动 debug(-m pdb) | **几乎不用** | 指令 | 英文 | 解释 | | :-----: | :-------------: | :----------------: | | tbreak | temporary break | 临时断点 | | disable | | 停用断点 | | enable | | 启用断点 | | alias | | 设置别名 | | unalias | | 删除别名 | | whatis | | 打印对象类型 | | ignore | | 设置忽略的断点 | | source | | 列出给定对象的源码 | 其上全部是我翻译自官方文档,原文在这里:https://docs.python.org/3/library/pdb.html 其实你大可不必死记这些命令,忘记的时候,只要敲入`help`并回车,就可以看所有的指令了。 ![](http://image.iswbm.com/20190118083809.png) ## 4. 开始调试 这里就几个最常用的指定,来演示一遍。 ![](http://image.iswbm.com/20190118005507.png) 这个调试过程,我加了些注释,你应该能够很轻易地理解这种调试方式。