由于需要写一些解析方面的脚本,所以研究了一下Python的调试,有IDE的情况下就简单很多,但是在Server环境下还是需要掌握基本的调试模块pdb。
pdb在python中是类似于gcc/gdb那样的调试模块,使用时只要引入即可。
假设现在需要调试的程序如下:
$ vim t.py
#!/usr/bin/python26
def main():
i, sum = 1, 0
for i in xrange(100):
sum = sum + i
print sum
if __name__ == '__main__':
main()
这时,需要对程序进行调试,将pdb模块引入:
$ python -m pdb t.py
注: Python 模块也可以当作脚本使用。它们可以用 python -m module [arg] … 调用, 这样就会像你在命令行中给出其完整名字一样运行模块源文件。
运行上面的命令后进入以下界面,可以输入类似 gdb 的命令来改变程序的执行流程:
$ python -m pdb t.py
> d.py(3)()
-> def main():
(Pdb)
使用list显示代码上下文:
(Pdb) list
1 #!/usr/bin/python26
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
> t.py(9)()
-> if __name__ == '__main__':
使用break设置断点,同样可以在函数的位置设置断点:
(Pdb) break t.py:6
Breakpoint 1 at t.py:6
(Pdb) list
1 #!/usr/bin/python26
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 t.main
t.py:3
(Pdb) list
1 #!/usr/bin/python26
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]
使用step进入函数内部执行,使用pp打印变量的值:
(Pdb) step
> t.py(5)main()
-> for i in xrange(100):
(Pdb) pp sum
0
更加直接的方法是在python脚本中直接引入pdb模块,需要的时候写入pdb.set_trace()之类的命令就可以了:
#!/usr/bin/python26
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()
按照以上的写法,只要运行
$ python t.py #或者./t.py 前提是有加执行的权限
> t.py(9)main()
-> print sum
(Pdb)
这样就直接到设置trace的位置了。
总结
命令 用途
break 或 b
设置断点
continue 或 c
继续执行程序
list 或 l
查看当前行的代码段
step 或 s
进入函数