python_pdb_module

来源:互联网 发布:淘宝卖家售后服务流程 编辑:程序博客网 时间:2024/06/09 16:27

**

转载**

**
Debug功能对于developer是非常重要的,python提供了相应的模块pdb让你可以在用文本编辑器写脚本的情况下进行debug. pdb是python debugger的简称。
常用的一些命令如下:
命令 用途
break 或 b 设置断点
continue 或 c 继续执行程序
list 或 l 查看当前行的代码段
step 或 s 进入函数
return 或 r 执行代码直到从当前函数返回
exit 或 q 中止并退出
next 或 n 执行下一行
pp 打印变量的值
help 帮助

开始介绍如何使用pdb。
使用的测试代码1: epdb1.py
import pdb
a = “aaa”
pdb.set_trace()
b = “bbb”
c = “ccc”
final = a + b + c
print final
关于set_trace()
pdb.set_trace()¶
Enter the debugger at the calling stack frame. This is useful to hard-code abreakpoint at a given point in a program, even if the code is not otherwisebeing debugged (e.g. when an assertion fails).
1 开始调试:
[root@rcc-pok-idg-2255 ~]# python epdb1.py

/root/epdb1.py(4)?()
-> b = “bbb”
(Pdb) n
/root/epdb1.py(5)?()
-> c = “ccc”
(Pdb)
/root/epdb1.py(6)?()
-> final = a + b + c
(Pdb) list
1 import pdb
2 a = “aaa”
3 pdb.set_trace()
4 b = “bbb”
5 c = “ccc”
6 -> final = a + b + c
7 print final
[EOF]
(Pdb)
[EOF]
(Pdb) n
/root/epdb1.py(7)?()
-> print final
(Pdb)
使用n+enter表示执行当前的statement,在第一次按下了n+enter之后可以直接按enter表示重复执行上一条debug命令。
If you press ENTER without entering anything, pdb will re-execute the last command that you gave it.

quit或者q可以退出当前的debug,但是quit会以一种非常粗鲁的方式退出程序,直接crash
[root@rcc-pok-idg-2255 ~]# python epdb1.py

/root/epdb1.py(4)?()
-> b = “bbb”
(Pdb) n
/root/epdb1.py(5)?()
-> c = “ccc”
(Pdb) q
Traceback (most recent call last):
File “epdb1.py”, line 5, in ?
c = “ccc”
File “epdb1.py”, line 5, in ?
c = “ccc”
File “/usr/lib64/python2.4/bdb.py”, line 48, in trace_dispatch
return self.dispatch_line(frame)
File “/usr/lib64/python2.4/bdb.py”, line 67, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit

在使用过程中打印变量的值,可以直接使用p加上变量名,但是需要注意的是打印仅仅在当前的statement已经被执行了之后才能看到具体的值,否则会报 NameError:

!/usr/bin/env python

import pdb

def test_debugger(some_int):
print “start some_int>>”, some_int
return_int = 10 / some_int
print “end some_int>>”, some_int
return return_int

if name == “main“:
pdb.run(“test_debugger(0)”)
pdb.runeval(expression[,globals[, locals]])
pdb.runeval() is identical to pdb.run(), exceptthat pdb.runeval() returns the value of the evaluated stringexpression:

!/usr/bin/env python

import pdb

def test_debugger(some_int):
print “start some_int>>”, some_int
return_int = 10 / some_int
print “end some_int>>”, some_int
return return_int

if name == “main“:
pdb.runeval(“test_debugger(0)”)
pdb.runcall(function[,argument, …])
pdb.runcall() calls the specified function andpasses any specified arguments to it:

!/usr/bin/env python

import pdb

def test_debugger(some_int):
print “start some_int>>”, some_int
return_int = 10 / some_int
print “end some_int>>”, some_int
return return_int

if name == “main“:
pdb.runcall(test_debugger, 0)
pdb.set_trace()
pdb.set_trace() drops the code into the debugger when executionhits it:

!/usr/bin/env python

import pdb

def test_debugger(some_int):
pdb.set_trace()
print “start some_int>>”, some_int
return_int = 10 / some_int
print “end some_int>>”, some_int
return return_int

if name == “main“:
test_debugger(0)
pdb.post_mortem(traceback)
pdb.post_mortem() performs postmortem debugging of thespecified traceback:

!/usr/bin/env python

import pdb

def test_debugger(some_int):
print “start some_int>>”, some_int
return_int = 10 / some_int
print “end some_int>>”, some_int
return return_int

if name == “main“:
try:
test_debugger(0)
except:
import sys
tb = sys.exc_info()[2]
pdb.post_mortem(tb)
pdb.pm()
pdb.pm() performs postmortem debugging of the tracebackcontained in sys.last_traceback:

!/usr/bin/env python

import pdb
import sys

def test_debugger(some_int):
print “start some_int>>”, some_int
return_int = 10 / some_int
print “end some_int>>”, some_int
return return_int

def do_debugger(type, value, tb):
pdb.pm()

if name == “main“:
sys.excepthook = do_debugger
test_debugger(0)