使用PDB简单调试Python程序简明指南,pdb调试python指南

by admin on 2019年9月3日

使用PDB简单调试Python程序简明指南,pdb调试python指南

在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入
pdb 模块(假设要调试的程序名为 d.py):
复制代码 代码如下:
$ vi d.py
#!/usr/bin/python

def main():
        i, sum = 1, 0
        for i in xrange(100):
                sum = sum + i
        print sum

if __name__ == ‘__main__’:
        main()

$ python -m pdb d.py

运行上面的命令后进入以下界面,可以输入类似 gdb
的命令来改变程序的执行流程:
复制代码 代码如下:
$ python -m pdb 1.py
> d.py(3)()
-> def main():
(Pdb)

list 显示程序的最近代码段:
复制代码 代码如下:
(Pdb) list
  1   #!/usr/bin/python
  2   
  3  -> def main():
  4    i, sum = 1, 0
  5    for i in xrange(100):
  6     sum = sum + i
  7    print sum
  8   
  9   if __name__ == ‘__main__’:
 10    main()
[EOF]

next 或者 n 执行下一行代码:
复制代码 代码如下:
(Pdb) next
> d.py(9)()
-> if __name__ == ‘__main__’:

用 break 在第6行设置一个断点:
复制代码 代码如下:
(Pdb) break d.py:6
Breakpoint 1 at d.py:6

(Pdb) list
  1   #!/usr/bin/python
  2   
  3   def main():
  4    i, sum = 1, 0
  5  ->  for i in xrange(100):
  6 B   sum = sum + i
  7    print sum
  8   
  9   if __name__ == ‘__main__’:
 10    main()
[EOF]

如果想在函数处设置断点:
复制代码 代码如下:
(Pdb) break d.main
d.py:3

(Pdb) list
  1   #!/usr/bin/python
  2   
  3 B def main():
  4  ->  i, sum = 1, 0
  5    for i in xrange(100):
  6     sum = sum + i
  7    print sum
  8   
  9   if __name__ == ‘__main__’:
 10    main()
[EOF]

还可以给断点加条件,比如设置条件只有当 sum > 50 的时候才 break:
复制代码 代码如下:
(Pdb) break d.py:6, sum > 50
Breakpoint 1 at d.py:6

如果想查看某个变量的值,可以用 pp 命令打印出来:
复制代码 代码如下:
(Pdb) step
> d.py(5)main()
-> for i in xrange(100):
(Pdb) pp sum
0

可以直接在程序里使用 pdb 模块,import pdb 后 pdb.set_trace():
复制代码 代码如下:
#!/usr/bin/python
import pdb

def main():
        i, sum = 1, 0
        for i in xrange(100):
                sum = sum + i
        pdb.set_trace()
        print sum

if __name__ == ‘__main__’:
        main()

这样只要运行程序 ./d.py 就可以直接运行到 print sum 处:
复制代码 代码如下:
$ ./d.py
> d.py(9)main()
-> print sum
(Pdb)

总结

图片 1

在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入
pdb 模块(假设…

以前写python一直用pycharm,调试啥的比较方便,最近要在远程服务器上调试一些程序,只有一个控制台就可以用pdb进行调试了。常用的只有几个命令。

使用PDB模式调试Python程序介绍,pdb模式调试python

以前在windows下一直用的idel带的功能调试python程序,在linux下没调试过。(很多时候只是print)就从网上查找一下~

方法:
复制代码 代码如下:
python -m pdb a.py

a.py是python文件。

(Pdb)模式下的常用命令:

q
退出debug

h 即help,打印所有可以命令

h w
打印命令 w 的含意

n
执行当前行直到到达下一行或直到它返回

s
执行当前行,一有可能就停止(比如当前行有一个函数调用)。它和n(next)的区别是当前行中有函数调用时s(step)会停止当前行的执行而去调用那个函数,而n不会停止,直到计算完成这一行(到达下一行)。

b(reak) [[filename:]lineno | function[, condition]]
设置断点,可以是行号或函数。如 b 10, b foo, b foo,n ==
5,最后在函数foo()入口处设置一个断点,但仅当n的值是5时才有效。当b命令无参数时,打印所有断点。

tb(reak) [[filename:]lineno | function[, condition]]
临时断点,只hit一次。

disable [bpnumber [bpnumber …]]
使指点行的断点(们)失效

enable [bpnumber [bpnumber …]]
使指定行上的断点(们)有效

c
继续执行程序,直到遇到下一个断点

w
即where,打印当前执行点的位置

l [first, [,last]]
输出当前行附近的源码

p expression
执行一个表达式当打印其值。

a(rgs)
打印当前函数的参数及其值

<直接回车>
重复执行上次的命令

并遇到pdb不认识的命令时,会将它当成python表达式执行。如果你想执行的表达时,最前面加上
! 字符,比如 !n == 5

多个debug命令可以写在一行上,中间用两个分号分隔,如 s;;s。

以前在windows下一直用的idel带的功能调试python程序,在linux下没调试过。(很多时候只是p…

用pdb调试有多种方式可选:

Python编程语言对于那些有经验的开发人员来说上手比较容易,而且这一语言的功能比较强大,是一款面向对象的通用型编程语言,可以帮助我们轻松的完成各种功能需求。我们今天先为大家介绍一下Python
PDB的相关调试方法。


1.
命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
python -m pdb myscript.py

  • Python连接SqlServer基本应用方式浅析
  • Python实现Socket服务操作技巧分享
  • 从Python发送邮件方式了解其易用特点
  • Python字典增删操作技巧简述
  • 各种常用Python字典应用方式详解
  • l : 查看代码
  • n : 运行下一行
  • s: 跳到函数内部
  • r: 运行到函数退出
  • pp:打印变量
  • c: 运行到下个断点
  • b : 添加一个断点
  • enable/ disable :
  1. 在Python交互环境中启用调试
    >>> import pdb
    >>> import mymodule
    >>> pdb.run(‘mymodule.test()’)

使用过C语言的程序员肯定对 GDB 不陌生,
它的单步调试等功能对于常常需要debug 的我们而言是非常重要的,
而作为动态语言的 Python 它的动态性等对于单步调试 带来了一定的难度, 但是
Python 的标准模块 PDB 则依照 GDB 较好地解决了
这个问题.本文就简单地介绍如何使用 PDB 进行单步调试.


在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入
pdb 模块(假设要调试的程序名为 d.py): www.2cto.com

什么是Python PDB

pdb 是 python 自带的一个包,为 python
程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

$ vi d.py
#!/usr/bin/python

根据 PDB 在 Python 文档中的定义, 它是一种为 Python 程序提供一种
交互的源码调试功能的模块.主要的特点(feature)包括:

使用的时候要import pdb再用pdb.set_trace()设置一个断点,运行程序的时候就会停在这。

def main():
        i, sum = 1, 0
        for i in xrange(100):
                sum = sum + i
        print sum

条件断点

import pdb

pdb.set_trace() #  设置断点

if __name__ == ‘__main__’:
        main()

源码行级的单步调试

命令

  • l : 查看运行的代码段。

(Pdb) l
125                 if self.is_cuda:
126                     outputs.append(Variable(data.cuda()))
127                 else:
128                     outputs.append(Variable(data))
129             pdb.set_trace()
130  ->         return tuple(outputs)
131  
132  
133     class CaffeMultiBoxLoss(nn.Module):
134         def __init__(self, layer, *input_shapes):
135             super(CaffeMultiBoxLoss, self).__init__()
(Pdb) c
forward_backward time: 1948.931108 1948.931108
> /data/zyj/caffe2pytorch/caffe_layers.py(119)forward()
-> data = self.net.blobs[name].data

l + 起始行号,就可以查看行号的上下五行。

l + 起始行号 结束行号,可以查看这么一段。

按完l继续按回车键可以继续往下查看。

  • n :运行到下一条语句。

(Pdb) n
> /data/zyj/caffe2pytorch/caffe_layers.py(120)forward()
-> if self.data_save_debug:
  • s : 跳转到函数内部。
  • pp + 变量 : 打印变量的值
  • c : 运行到下个断点
  • r : 运行到函数退出。

(Pdb) r
--Return--
>n^H /data/zyj/caffe2pytorch/caffe_layers.py(130)forward()->(Variable...(GPU 0)]
, Variable...(GPU 0)]
)
-> return tuple(outputs)
  • help + [命令]: 帮助。

(Pdb) help

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

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

Undocumented commands:
======================
retval  rv

(Pdb) help n
n(ext)
Continue execution until the next line in the current function
is reached or it returns.
  • b + 行号:设置断点。

(Pdb) b 125
Breakpoint 2 at /data/zyj/caffe2pytorch/train_wider.py:125

就一个b就是是打印断点在哪。

(Pdb) b 
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /data/zyj/caffe2pytorch/train_wider.py:121
2   breakpoint   keep yes   at /data/zyj/caffe2pytorch/train_wider.py:125
  • q : 退出。
  • j + 行号 :执行到行号

(Pdb) j 119
> /data/zyj/caffe2pytorch/train_wider.py(119)<module>()
-> for test_device_id in test_device_ids:
  • w : 打印函数栈

(Pdb) w
  /data/zyj/caffe2pytorch/train_wider.py(112)<module>()
-> net.cuda()
> /home/zyj/anaconda2/lib/python2.7/site-packages/torch/nn/modules/module.py(216)cuda()
-> return self._apply(lambda t: t.cuda(device))
  • cl + 断点号: 清除断点

(Pdb) b 
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /data/zyj/caffe2pytorch/train_wider.py:121
2   breakpoint   keep yes   at /data/zyj/caffe2pytorch/train_wider.py:125
(Pdb) cl 1
Deleted breakpoint 1
(Pdb) b
Num Type         Disp Enb   Where
2   breakpoint   keep yes   at /data/zyj/caffe2pytorch/train_wider.py:125

$ python -m pdb d.py
运行上面的命令后进入以下界面,可以输入类似 gdb
的命令来改变程序的执行流程:

查看栈片断

$ python -m pdb 1.py
> d.py(3)()
-> def main():
(Pdb)
list 显示程序的最近代码段:

在任意的栈片断的环境下对任意的代码进行求值(类似于 GDB )

(Pdb) list
  1   #!/usr/bin/python
  2
  3  -> def main():
  4    i, sum = 1, 0
  5    for i in xrange(100):
  6     sum = sum + i
  7    print sum
  8
  9   if __name__ == ‘__main__’:
 10    main()
[EOF]
next 或者 n 执行下一行代码:

代码列出

(Pdb) next
> d.py(9)()
-> if __name__ == ‘__main__’:
用 break 在第6行设置一个断点:

其它

(Pdb) break d.py:6
Breakpoint 1 at d.py:6

使用Python PDB进行简单的调试

(Pdb) list
  1   #!/usr/bin/python
  2
  3   def main():
  4    i, sum = 1, 0
  5  ->  for i in xrange(100):
  6 B   sum = sum + i
  7    print sum
  8
  9   if __name__ == ‘__main__’:
 10    main()
[EOF]
如果想在函数处设置断点:

Python 程序也可以实现类似于c/c++的单步调试功能,而 Python 中的调试模块
PDB 类似于c中的 GDB 常用命令等),可以进行方便的调试。

(Pdb) break d.main
d.py:3

下面是一个例子(debug_demo.py):

(Pdb) list
  1   #!/usr/bin/python
  2
  3 B def main():
  4  ->  i, sum = 1, 0
  5    for i in xrange(100):
  6     sum = sum + i
  7    print sum
  8
  9   if __name__ == ‘__main__’:
 10    main()
[EOF]
还可以给断点加条件,比如设置条件只有当 sum > 50 的时候才 break:

#!/usr/bin/env Python  _debug = True def debug_demo(val):  if _debug:  import pdb  pdb.set_trace() #引入相关的pdb模块  if val < 10: print "less than 10"  elif val<20: print "less than 20, but big than 10"  else:  print "other condition" 

(Pdb) break d.py:6, sum > 50
Breakpoint 1 at d.py:6
如果想查看某个变量的值,可以用 pp 命令打印出来:

在命令行中按如下方法进行调试:

(Pdb) step
> d.py(5)main()
-> for i in xrange(100):
(Pdb) pp sum
0
可以直接在程序里使用 pdb 模块,import pdb 后 pdb.set_trace():

Python debug_demo.py 

#!/usr/bin/python
import pdb

这时会进入类似于gdb的界面,启动相关的调试

def main():
        i, sum = 1, 0
        for i in xrange(100):
                sum = sum + i
        pdb.set_trace()
        print sum

> /home/tower/test/Python/debug.py(9)debug_demo()  -> if val <= 10:  (Pdb) 

if __name__ == ‘__main__’:
        main()
这样只要运行程序 ./d.py 就可以直接运行到 print sum 处:

可以输入h来查看可用的命令集很类似于gdb)。
单步调试对于某些情况下的调试是非常有帮助的

$ ./d.py
> d.py(9)main()
-> print sum
(Pdb)
总结
命令
用途

结论

break 或 b
设置断点

单步调试对于程序关键部分的逻辑跟踪是很有意义的,所以Python PDB之于 Python
类似于 GDB 之于C/C++. 但是相比于 GDB 而言, PDB 的功能还稍显弱了许多,
所以还无法在 PDB里使用到 GDB 的所有feature. 可以预期的是随着 Python
转至3.0及至后面的版本升级, PDB 也会愈发完善.值得期待.

continue 或 c
继续执行程序

list 或 l
查看当前行的代码段

step 或 s
进入函数

return 或 r
执行代码直到从当前函数返回

exit 或 q
中止并退出

next 或 n
执行下一行

pp
打印变量的值

help
帮助

1.
命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
python -m pdb myscrip…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图