Python程序调试

由于需要写一些解析方面的脚本,所以研究了一下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
进入函数