Python调试工具之pdb

对于开发人员来说,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调试工具。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容