• 用PDB库调试Python程序


    用pdb调试有多种方式可选:

    1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
    python -m pdb myscript.py

    2. 在Python交互环境中启用调试
    >>> import pdb
    >>> import mymodule
    >>> pdb.run(‘mymodule.test()’)

    在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入 pdb 模块(假设要调试的程序名为 d.py):

    $ vi d.py
    #!/usr/bin/python
    
    def main():
            i, sum = 1, 0
            for i in xrange(100):
                    sum = sum + i
            print sum
    
    if __name__ == '__main__':
            main()
    
    $ python -m pdb d.py

    运行上面的命令后进入以下界面,可以输入类似 gdb 的命令来改变程序的执行流程:

    $ python -m pdb 1.py
    > d.py(3)()
    -> def main():
    (Pdb)

    list 显示程序的最近代码段:

    (Pdb) list
      1  	#!/usr/bin/python
      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
    > d.py(9)()
    -> if __name__ == '__main__':

    用 break 在第6行设置一个断点:

    (Pdb) break d.py:6
    Breakpoint 1 at d.py:6
    
    (Pdb) list
      1  	#!/usr/bin/python
      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 d.main
    d.py:3
    
    (Pdb) list
      1  	#!/usr/bin/python
      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]

    还可以给断点加条件,比如设置条件只有当 sum > 50 的时候才 break:

    (Pdb) break d.py:6, sum > 50
    Breakpoint 1 at d.py:6

    如果想查看某个变量的值,可以用 pp 命令打印出来:

    (Pdb) step
    > d.py(5)main()
    -> for i in xrange(100):
    (Pdb) pp sum
    0

    可以直接在程序里使用 pdb 模块,import pdb 后 pdb.set_trace():

    #!/usr/bin/python
    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()

    这样只要运行程序 ./d.py 就可以直接运行到 print sum 处:

    $ ./d.py
    > d.py(9)main()
    -> print sum
    (Pdb)

    总结

    命令
    用途

    break 或 b
    设置断点

    continue 或 c
    继续执行程序

    list 或 l
    查看当前行的代码段

    step 或 s
    进入函数

    return 或 r
    执行代码直到从当前函数返回

    exit 或 q
    中止并退出

    next 或 n
    执行下一行

    pp
    打印变量的值

    help
    帮助

    参考自:http://www.vpsee.com/2009/09/debug-python-programwith-pdb/

    http://magustest.com/blog/python/use-pdb-debug-python/

    http://linhs.blog.51cto.com/370259/125323

  • 相关阅读:
    jvm类加载
    SpringMVC拦截器踩坑日记
    ConcurrentHashMap源码
    HashMap源码
    Linux搭建数据质量监控 Griffin
    那些说代码管理不方便的,我估计是你不会用git(Git源码管理)
    VS2019 开发AngularJS(TypeScript)代码缩进处理
    Arraylist和Map哪个性能更好
    dynamics crm 团队及团队模板
    无法加载文件或程序集 PublicKeyToken=null'或其依赖之一,需要强名称的程序集
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2469072.html
Copyright © 2020-2023  润新知