【转】python pdb 调试

python 调试

Python自带了一个调试器叫pdb,和Gnu的gbd类似。下面用一个简单的程序来演示pdb的功能。

使用 pdb package 時, 交相应的调试脚本做为参数,利用如下命令 %PYTHONHOME%/lib/pdb.py

就行了:如: %PYTHONHOME%/lib/pdb.py test.py

test.py 为我们将要调用的python 脚本


进行pdb的互动调试方式下:

12
> (1)?()
(Pdb)

 


更方便的方法,建立批处理文件,,放在 %PYTHONHOME%底下。例如一個 pdb.bat,裡面的內容是:


c:\python23\lib\pdb.py %1


如此可在任何地方进行调试。

进入 pdb,要设置断点


c:\>pdb test.py
> <string>(1)?()
(Pdb)b 1
Breakpoint 1 at

c:\test.py:1

 


()后面的VC++调试中断方式。

b(reak) [[filename:]lineno|function[, condition]]
在指定的文件、行数或函数下进行断点设置。也可为中断点设定中断条件,例如要在 for循环下进行中断设置或某个值出现时中断,就可以进行相应中断点条件的设置。如果没有能数,则列出所有中断点。

tbreak [[filename:]lineno|function[, condition]]
和 b 一样,但只会中断一次

c(ont(inue))
继续运行,直到中断点F5)

s(tep)
执行当前(F10)

n(ext)
和 s 一样执行目前行。。不同的是如果是参数,则进入函数内(F11)

w(here)
列出目前 call stack 中的所在层。

d(own)
在 call stack 中往下移一层。

u( p)
在 call stack 中往上移一层。如果在上移一层之後按下 n ,则会在上移之后的一层,再去执行下一层。

cl(ear) [bpnumber [bpnumber ...]]
清除指定的中断点。如果无参数,则清除所有中断点

disable [bpnumber [bpnumber ...]]
取消所有中断点的功能,但是保留中断点

enable [bpnumber [bpnumber ...]]
恢昨中断点功能。

ignore bpnumber [count]
设定中断的忽略次数,如果没指定count,则初始为0.当count 为0,则中断点会正常动作。若有指定 count,则每次执行该中断。, count 就少 1,直到 count 为0

condition bpnumber [condition]
为某个中断点,设定中断条件。

j(ump) lineno
跳到某行執行。只有在 call stack 的最底部才能作用。

l(ist) [first[, last]]
列出目前所在文件中的的位置。边续地

a(rgs)
列出目前函式所接受的参数

p expression
在目前的环境(context)中求出 expression 的值。

pp expression
和 p 命令類似,但是使用 pprint module(沒用過 pprint,可看 Python Library Reference)。

alias [name [command]]
以一个别名代替所有调试除错命令。类似c/c++ 的 macro(详情参考 Python Library Reference)。

unalias name
取消某個 alias。

[!]statement
在目前的环境(context)中执行描述

q(uit)
退出调试模式。

程序代码如下:

#!/usr/bin/pythonimport pdba = "aaa"pdb.set_trace()b = "bbb"c = "ccc"final = a + b + cprint final对这个程序进行调试:
1:在文件前面加上这一句,引入调试的模块。
import pdb
2:在要开始调试的一行加上pdb.set_trace()

该程序已导入pdb模块,并在代码中添加的pdb.set_trace()跟踪点。现在让我们来运行该程序。

localhost:~/python/pdb# python pdbtest.py--Return--> /usr/lib/python2.3/pdb.py(992)set_trace()->None-> Pdb().set_trace() # 从跟踪点开始执行(Pdb) n # n 读入下一行代码> /root/python/pdb/pdbtest.py(6)?()-> b = "bbb"(Pdb) n> /root/python/pdb/pdbtest.py(7)?()-> c = "ccc"(Pdb) p b # p 打印变量值'bbb'(Pdb) l # l 显示当前执行位置 2 3 import pdb 4 a = "aaa" 5 pdb.set_trace() 6 b = "bbb" 7 -> c = "ccc" 8 final = a + b + c 9 print final 10[EOF](Pdb) n > /root/python/pdb/pdbtest.py(8)?()-> final = a + b + c(Pdb) n # 如果命令和上次的一样,也可直接按回车,不用输入'n' > /root/python/pdb/pdbtest.py(9)?()-> print final(Pdb) naaabbbccc--Return--> /root/python/pdb/pdbtest.py(9)?()->None-> print final(Pdb) p a,b,c,final('aaa', 'bbb', 'ccc', 'aaabbbccc')(Pdb)('aaa', 'bbb', 'ccc', 'aaabbbccc')(Pdb) nlocalhost:~/python/pdb# # 返回shell其它命令:p(print) 查看一个变量值
n(next) 下一步
s(step) 单步,可进入函数
c(continue)继续前进
l(list)看源代码

pdb还有很多命令,用help命令就可以列出所有的pdb命令,用help p可以查询p命令的说明。

 

posted on 2011-12-01 10:09  xuq  阅读(253)  评论(0编辑  收藏  举报

导航