关于小悟志网站地图归档友情链接联系Feed

云上小悟 + 

首页 » InfoTech »

使用Pdb调试Python程序

InfoTech
2016年11月29日 / 134次阅读
标签:麦新杰用Python

文章《使用Pdb调试Python程序》的特色图片

pdb是Python标准库自带的一个模块,可以用来调试程序。

麦新杰调试从来都是使用print,不过,有的时候遇到比较诡异的问题,使用高级一点的工具还是更方便一些。Python的pdb正好填补这个地方,而且pdb还是标准库里面的模块,随时都可以用。

麦新杰不是很喜欢直接在源代码中插入pdb.set_trace()的方式启动pdb,这样会破坏源代码的美感。最好是在模块中设置一个启动函数,然后在python运行窗口直接使用如下方式进入pdb调试:

>>>
>>> import pdb
>>> pdb.run('za.testList()')
> <string>(1)<module>()->None
(Pdb) s
--Call--
> d:\onlinepro\za.py(262)testList()
-> def testList(LL=[]): # can not be LL=[:]
(Pdb)

s是step命令的简写,表示进入函数;

n是next命令的简写,表示下一步,如果在上面的运行过程中,我们首先使用n的话,函数直接就当成一行语句,执行完毕了,没法调试。所以,我们上面看到的是使用s,进入函数,开始我们的调试。

h是help的简写,列出所有可以使用的pdb指令,如下:

>>> import pdb
>>> pdb.run('za.testList()')
> <string>(1)<module>()->None
(Pdb) s
--Call--
> d:\onlinepro\za.py(262)testList()
-> def testList(LL=[]): # can not be LL=[:]
(Pdb) h

Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt
alias  clear      disable  ignore    longlist  r        source   until
args   commands   display  interact  n         restart  step     up
b      condition  down     j         next      return   tbreak   w
break  cont       enable   jump      p         retval   u        whatis
bt     continue   exit     l         pp        run      unalias  where

Miscellaneous help topics:
==========================
pdb  exec

(Pdb)

常用的除了s,n,还有c,表示continue执行到断点处,如果没有设置断点,直接就执行完毕。

使用l或者ll来显示源代码(l显示的少,ll显示的多一些),源代码对应的行号会显示出来,行号用来设置断点,使用b命令。

(Pdb) l
268         del LL[0] # delete the first element of the list
269         #del LL
270         print(id(LL))
271
272         aa = [2,7,5,9,1,2,6]
273         bb = sorted(aa)
274         cc = sorted(aa, reverse=True)
275         print(aa)
276         print(bb)
277         print(cc)
278         aa.sort()
(Pdb) b 276
Breakpoint 3 at d:\onlinepro\za.py:276
(Pdb) cl
Clear all breaks? y
Deleted breakpoint 3 at d:\onlinepro\za.py:276
(Pdb)

使用cl命令来清楚所有断点。

使用p命令来打印变量的值:

(Pdb) l
272         aa = [2,7,5,9,1,2,6]
273         bb = sorted(aa)
274         cc = sorted(aa, reverse=True)
275         print(aa)
276 B       print(bb)
277  ->     print(cc)
278         aa.sort()
279         print(aa)
280
281         #ww = input('what do you want:') # input a string
282         #print('You want:', ww, type(ww))
(Pdb) p aa
[2, 7, 5, 9, 1, 2, 6]
(Pdb) p bb
[1, 2, 2, 5, 6, 7, 9]
(Pdb) p cc
[9, 7, 6, 5, 2, 2, 1]
(Pdb)

 

常用的就是这些命令,pdb有一个特点,如果直接回车,将会默认再次执行上一个指令,比如刚使用了n下一步,这时不再输入n,直接回车,等同于输入n回车。

Python的pdb也有一些局限:不能远程调试,不能调多线程。(没见过远程调试,多线程就直接print)

 

2017-08-25:

直接在理解程序的基础上,使用print打印就能够debug,简单但是效率可能稍差一点。

补充一个细节:Python print函数遇到非引号内的逗号(,)会自动打印出一个空格。这是人性化呀。

本文链接:http://www.maixj.net/ict/pdb-python-13696
云上小悟 麦新杰(QQ:1093023102)

相关文章

评论是美德

《使用Pdb调试Python程序》有1条评论

无力满足评论实名制,评论对非实名注册用户关闭,有事QQ:1093023102.


前一篇:
后一篇:

栏目精选


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1

网站二维码
拍拍贷
go to top