Python调试工具之pdb

作者: A遇上方知友 | 来源:发表于2019-05-27 14:46 被阅读0次

对于开发人员来说,DEBUG是一项必不可少的能力,在很多开发工作中是绕不开DEBUG过程的。不同的人偏好于不同的DEBU方式,本文就介绍一下Python自带的一个DEBUG工具包,对于偏好于使用VIM、sublime、notepad之类纯文本编辑器进行开发的工程人员来说是一个比较基础且实用的工具包。

print

查看变量值和变量类型是否符合我们预期是DEBUG过程中一项非常重要的工作或目的,很多刚接触编程语言的人员习惯于采用print输出中间变量值或者变量类型,

def test():
    x, y = 1, 2
    z = x + y
    print(z)
​
​
if __name__ == '__main__':
    test()

输出:

>>> 3

用print进行debug虽然简单,但是却有很多弊端:

  • 输出信息多而杂乱
  • 需要在变量处反复注释取消注释,过程繁琐

log

更近一层的开发人员会选择用log日志的方式进行debug,通过对输出日志设置DEBUG、INFO、WARNING、ERROR、CRITICAL等级别来控制日志的输出,当输出级别小于设置级别时信息不会输出,当级别在设置级别之上时才会被输出,级别大小依次是DEBUG<INFO<WARNING<ERROR<CRITICAL,因此,当级别设置为http://logging.INFO时,DEBUG级别就不会输出,WARNING、ERROR、CRITICAL会输出,通过这种方式避免不同场景下输出内容杂乱的问题。

import logging
​
logging.basicConfig(level=logging.INFO)
​
​
def test():
    x, y = 1, 2
    z = x + y
    logging.debug(" debug z value : {}".format(z))
    logging.warning(" warning z value : {}".format(z))
    logging.error(" error z value : {}".format(z))
    logging.critical(" critical z value : {}".format(z))
​
​
if __name__ == '__main__':
    test()

输出:

>>> WARNING:root: warning z value : 3
>>> ERROR:root: error z value : 3
>>> CRITICAL:root: critical z value : 3

IDE

目前很多入门或者深入Python的开发者都选择使用一些成熟的IDE进行开发,例如pycharm。它自带debug工具,因此就不需要在代码中大量的使用print、logging字段,减少了代码的繁琐性。

image

例如图中所示:

  • 通过点击左侧栏设置断点(1)

  • 点击2所示图标进行debug

  • 通过3选择要执行的动作

  • Step over--下一步

  • Step into--进入函数

  • Step out--执行剩余部分然后跳出函数

  • Run to cursor--执行到光标处

  • 通过4的variables查看当前所有变量

  • 通过5的"+"添加特定要查看的变量

不得不承认,IDE的debug工具的确很强大、而且很好用,但是我认为这样有一个弊端,就是过度依赖IDE,如果没有IDE的话却不知道从何下手,然后不得不回到最原始的print、log方式。

如果有想要学习Python或者正在学习Python中的小伙伴,需要学习资料的话,可以到我的微信公众号:Python学习知识圈,后台回复:“01”,即可拿Python学习资料

pdb

当脱离高效的IDE之后,该怎么进行DEBUG?

很多人喜欢用sublime、vim等纯文本编辑器,这些编辑器本身是不具备pycharm这样高效的debug工具的,那该怎么样使得这些文本编辑器也可以用于Python的debug呢?接下来就介绍一个Python自带的基础工具包pdb。

pdb的使用有两种方式:

  • 命令行方式
  • 直接导入pdb包

命令行模式直接在命令行下输入下面命令即可,

python -m pdb xxx.py

其中xxx.py指的是需要调试的Python程序。

直接导入pdb包的方式如下,

# 导入pdb包
import pdb
​
# 设置断点
pdb.set_trace()
​
# 执行程序
Python xxx.py

pycharm支持Step over、Step into、Step out等快捷方式,pdb是不是仅仅支持set_trace设置断点这么弱?当然不是!

pdb支持丰富而强大的调试命令:

命令功能n执行下一条语句,相当于Step overs相当于Step intor执行当前函数剩余部分,相当于Step outl列出代码片段c执行到下一个断点a列出可执行的函数pp输出变量值q退出debug

对于命令行模式还可以使用如下命令:

命令功能b添加断点:b LineNumber:在指定行添加断点 b FileName:LineNumber:在指定文件的指定行添加断点 b 列出当前所有断点tbreak设置临时断点cl清楚断点disable停用断点enable激活断点

下面就来演示一下:

import pdb
​
​
def add(x, y)
    k = 10
    z = x + y
    for i in range(k):
        pdb.set_trace()
        z += i
    return z
​
def main():
    x, y = 1, 2
    pdb.set_trace()
    z = add(x, y)
    print(z)

if __name__ == '__main__':
    main()

执行程序,到达第一个断点处:

python test.py
> d:\pycharmprojects\learning\test.py(15)main()
-> z = add(x, y)

进入add函数(step into):

(Pdb) s
--Call--
> d:\pycharmprojects\learning\test.py(4)add()
-> def add(x, y):

下一行(step over):

(Pdb)
> d:\pycharmprojects\learning\test.py(6)add()
-> z = x + y

执行到z=x+y这一行,然后跳过当前函数,执行剩余部分(step out):

(Pdb) r
--Return--
> d:\pycharmprojects\learning\test.py(10)add()->48
-> return z

输出变量:

(Pdb) pp z
48

列出当前代码片段:

(Pdb) l
  5         k = 10
  6         z = x + y
  7         for i in range(k):
  8             pdb.set_trace()
  9             z += i
 10  ->     return z
 11
 12     def main():
 13         x, y = 1, 2
 14         pdb.set_trace()
 15         z = add(x, y)

上述就介绍了一种高效的Python调试工具包,对于喜欢用文本编辑器进行程序开发的人员来说,这是非常实用而且高效的方式,能够针对性的设置断点、输出变量值,不用繁琐、杂乱的使用print、log方式。

当然,除了pdb之外还有很多高校的Python调试工具包,后续会单独介绍一种更为简单高效的Python调试工具。

相关文章

网友评论

    本文标题:Python调试工具之pdb

    本文链接:https://www.haomeiwen.com/subject/fkdhtctx.html