用了三年的 pdb,没想到还能这么调试

Posted 机器学习算法与Python学习-公众号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用了三年的 pdb,没想到还能这么调试相关的知识,希望对你有一定的参考价值。

点击 机器学习算法与Python学习选择加星标

精彩内容不迷路

关于代码调试的技巧,我之前写过很多的文章,加起来也有 将近 10 篇了,关注比较早的同学,也应该都有看过。

其中有一篇是关于 pdb 的调试技巧的:使用 pdb 进行无界面调试

里面介绍了两种 pdb 的调试入口,也是大部分所熟知的。

这里再带大家回顾一下

第一种:指定 -m pdb 来开启

$ python -m pdb pdb_demo.py

第二种:使用 pdb.set_trace() 在代码中设置断点

import pdb

pdb.set_trace()

但其实,pdb 还另外两种调试方法,第一种方法,可能有 99% 的开发者都没用过,甚至连见过都没有。

这两种方法,是配合 Python Console 的交互界面来实现的。

首先我准备好一个名为 utils.py 的 Python文件,里面定义了一个 sum 的工具函数(仅作演示用)。

def sum(*args):
    result = 0
    for arg in args:
        result += arg

    return result

然后在终端敲入 Python 进入 Console 的模式,导入这个模块,并调用 sum 函数,在正常情况下,函数可以正常工作。

>>> import utils
>>> utils.sum(1,2,3)
6

但如果你的参数类型传成了 str,函数就会报错啦~

>>> utils.sum(1,2,"3")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/MING/utils.py", line 4, in sum
    result += arg
TypeError: unsupported operand type(s) for +=:  int  and  str 

由于这里的报错是我刻意触发的,从报错来看,是很容易定位的。

但是在实际应用中,难免会遇到一些无法从报错信息直接判断 bug 所在的情况。

这个时候,如果可以在报错后,切换到 pdb 的调试模式就好了~

事实上,pdb 是支持这种用法的。

只要你在当前的会话中,导入 pdb,再执行 pdb.pm(),就可以切换到熟悉的 pdb 调试界面,并在抛错的地方打上断点,然后你就可以任意的查看运行时的变量信息。

如果你不是想等报错了再调试,而是一开始就想进入调试模式,可以使用 pdb.runcall() 函数

有的同学可能还会想到 pdb.run()  和 pdb.runeval() 这两个函数,但这两种方法,是需要提前在函数调试断点的,这就比较麻烦了,一般情况下不推荐使用。

综上所述, pdb 调试方法主要有六种:

  1. python -m pdb:运行 python 文件时直接进入调试模式

  2. pdb.set_trace():事先设置断点,然后直接运行 python 文件

  3. pdb.run():事先设置断点,然后直接运行 python 模块

  4. pdb.runeval():事先设置断点,然后直接运行 python 模块(与 pdb.run 类似)

  5. pdb.pm():在 Console 模式下出错后直接切换到调试模式,并定位到报错位置。

  6. pdb.runcall():可以在不设置断点的情况下,直接调试代码片段。

其中,pdb.pm() 是本文的重点,他虽然冷门,但却很好用,推荐给大家。

以上就是我今天的分享,希望对你有用,如果你也有好用的调试小技巧,欢迎留言分享,互相学习。

以上是关于用了三年的 pdb,没想到还能这么调试的主要内容,如果未能解决你的问题,请参考以下文章

对!我就是那个软件测试学了三年的学员

薪资9k!三年教培老师被优化,选择转行软件测试实现再就业

用了三年 ThreadLocal 今天才弄明白其中的道理

用了三年 ThreadLocal 今天才弄明白其中的道理

Snipaste - 开发了三年的截图工具,但不只是截图

外包干了三年,废了。