Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的。
用pdb调试有多种方式可选:
1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
python -m pdb myscript.py
2. 在Python交互环境中启用调试
>>> import pdb
>>> import mymodule
>>> pdb.run(‘mymodule.test()’)
3. 比较常用的,就是在程序中间插入一段程序,相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的
if __name__ == "__main__":
a = 1
import pdb
pdb.set_trace()
b = 2
c = a + b
print (c)
用pdb调试有多种方式可选:
1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
python -m pdb myscript.py
2. 在Python交互环境中启用调试
>>> import pdb
>>> import mymodule
>>> pdb.run(‘mymodule.test()’)
3. 比较常用的,就是在程序中间插入一段程序,相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的
if __name__ == "__main__":
a = 1
import pdb
pdb.set_trace()
b = 2
c = a + b
print (c)
然后正常运行脚本,到了pdb.set_trace()那就会定下来,就可以看到调试的提示符(Pdb)了
常用的调试命令
h(elp),会打印当前版本Pdb可用的命令,如果要查询某个命令,可以输入 h [command],例如:“h l” — 查看list命令
l(ist),可以列出当前将要运行的代码块
在交互环境中通常使用pdb.run来调试:
import
pdb def
pdb_test(arg): for
i in
range (arg): print (i) return
arg pdb.run( "pdb_test(3)" ) |
b 函数名、行号:
打断点,b可以查询所有的断点。
(Pdb) b pdb_test Breakpoint
1 at c:\users\plpcc\desktop\pdbtest.py: 3 (Pdb) b Num Type
Disp Enb Where 1
breakpoint keep yes at c:\users\plpcc\desktop\pdbtest.py: 3 |
c:
运行程序,直到遇到断点。
(Pdb) c > c:\users\plpcc\desktop\pdbtest.py( 4 )pdb_test() - >
for i
in range (arg): |
l:
查看断点周围的代码
(Pdb) l 1
import pdb 2 3
B def
pdb_test(arg): 4
- > for
i in
range (arg): 5
print (i) 6
return arg 7 8
pdb.run( "pdb_test(3)" ) |
a:
查看参数
(Pdb) a arg =
3 |
s, n:
单步运行,区别s会进入路径中的函数,n不会进入
p:
查看表达式的值
(Pdb) p i 0 |
condition:
条件断点,只有条件为true断点才命中
> c:\users\plpcc\desktop\pdbtest.py( 5 )pdb_test() - >
print (i) (Pdb) l 1
import pdb 2 3
def pdb_test(arg): 4
for i in
range (arg): 5
B - >
print (i) 6
return arg 7 8
pdb.run( "pdb_test(3)" ) [EOF] (Pdb) b Num Type
Disp Enb Where 2
breakpoint keep yes at c:\users\plpcc\desktop\pdbtest.py: 5 (Pdb) condition
2 i = = 1
/ / i = = 1 时才触发断点 2 New condition
set for
breakpoint 2. (Pdb) b Num Type
Disp Enb Where 2
breakpoint keep yes at c:\users\plpcc\desktop\pdbtest.py: 5 stop only
if i = = 1 (Pdb) c 0
/ / i = = 0 直接打印未断住 > c:\users\plpcc\desktop\pdbtest.py( 5 )pdb_test() - >
print (i)
/ / 触发断点,i = = 1 (Pdb) p i 1 |
bt:
查看调用堆栈
(Pdb) bt c:\python33\lib\bdb.py( 405 )run() - >
exec (cmd,
globals ,
locals ) <string>( 1 )<module>() > c:\users\plpcc\desktop\pdbtest.py( 5 )pdb_test() - >
print (i) |
r:
执行到函数返回
(Pdb) r 1 2 - - Return - - > c:\users\plpcc\desktop\pdbtest.py( 6 )pdb_test() - > 3
/ / 代码位置、函数返回值 - > 3 - >
return arg
/ / 代码位置的语句 (Pdb) l 1
import pdb 2 3
def pdb_test(arg): 4
for i in
range (arg): 5
print (i) 6
- > return
arg 7 8
pdb.run( "pdb_test(3)" ) |
通过pdb.set_trace() 在代码中指定位置嵌入一个断点,通常可以通过调试开关来控制
import
pdb __DEBUG__
= True def
pdb_test(arg): if
True = =
__DEBUG__: pdb.set_trace() for
i in
range (arg): print (i) return
arg pdb_test( 3 ) |
运行后在pdb.set_trace()位置被断住,当__DEBUG__ = False,代码正常运行
> c:\users\plpcc\desktop\pdbtest.py( 8 )pdb_test() - >
for i
in range (arg): (Pdb) l 3
__DEBUG__ =
True 4 5
def pdb_test(arg): 6
if True
= = __DEBUG__: 7
pdb.set_trace() 8
- > for
i in
range (arg): 9
print (i) 10
return arg 11 12
pdb_test( 3 ) [EOF] |
通过pdb.pm()进行事后调试,可以跟踪异常程序最后的堆载信息:
Traceback (most recent call last):
File
"C:\Users\plpcc\Desktop\pdbTest.py"
, line
13
,
in
<module>
pdb_test(
3
)
File
"C:\Users\plpcc\Desktop\pdbTest.py"
, line
10
,
in
pdb_test
1
/
0
ZeroDivisionError: division by zero
>>>
import
pdb
>>> pdb.pm()
> c:\users\plpcc\desktop\pdbtest.py(
10
)pdb_test()
-
>
1
/
0
(Pdb) l
5
def
pdb_test(arg):
6
if
True
=
=
__DEBUG__:
7
pdb.set_trace()
8
for
i
in
range
(arg):
9
print
(i)
10
-
>
1
/
0
11
return
arg
12
13
pdb_test(
3
)