• pdb在python程序中应用


    1.什么是pdb?

      pdb是python提供的调试程序的一种工具。

    2.为什么需要pdb模块?

      当我们的程序越写越大的时候,我们用print xxx 这种方式打断点,调试,非常不方便,这个时候我们需要专业的调试工具

    3 如何使用pdb模块?

    #!/usr/bin/env python
    #coding:utf-8
    
    
    import pdb
    
    def a():
        print "this is a"
    
    def b():
        print "this is b"
    
    def c():
        print "this is c"
    
    def main():
        pdb.set_trace()
        a()
        print "a is done"
        print "---------------"
        pdb.set_trace()
        b()
        print "b is done"
        print "---------------"
        pdb.set_trace()
        c()
        print "c is done"
        print "--------------"
        
    
    main()
    

     我们写了这样一个程序,在行首import了pdb模块

    然后在需要打断点插入这么一行代码  pdb.set_trace(),然后我们在执行的时候就变成这样

    root@SSS:/data/last/rebootMon/nbNet# python pdb_test.py 
    > /data/last/rebootMon/nbNet/pdb_test.py(18)main()
    -> a()
    (Pdb) 
    

     这个时候我们可以敲入对应指令,达到对应效果

          n  --->  下一行:

       

     start
    > /data/last/rebootMon/nbNet/pdb_test.py(19)main()
    -> a()
    (Pdb) n
    this is a
    > /data/last/rebootMon/nbNet/pdb_test.py(20)main()
    -> print "a is done"
    (Pdb) n
    a is done
    > /data/last/rebootMon/nbNet/pdb_test.py(21)main()
    -> print "---------------"
    (Pdb) n
    ---------------
    > /data/last/rebootMon/nbNet/pdb_test.py(22)main()
    -> pdb.set_trace()
    (Pdb) n
    > /data/last/rebootMon/nbNet/pdb_test.py(23)main()
    -> b()
    (Pdb) n
    this is b
    > /data/last/rebootMon/nbNet/pdb_test.py(24)main()
    -> print "b is done"
    (Pdb) n
    b is done
    > /data/last/rebootMon/nbNet/pdb_test.py(25)main()
    -> print "---------------"
    (Pdb) n
    ---------------
    > /data/last/rebootMon/nbNet/pdb_test.py(26)main()
    -> pdb.set_trace()
    (Pdb) n
    > /data/last/rebootMon/nbNet/pdb_test.py(27)main()
    -> c()
    (Pdb) n
    this is c
    > /data/last/rebootMon/nbNet/pdb_test.py(28)main()
    -> print "c is done"
    (Pdb) n
    c is done
    > /data/last/rebootMon/nbNet/pdb_test.py(29)main()
    -> print "--------------"
    (Pdb) n
    --------------
    --Return--
    

     我们可以看到当代码执行到一个断点的位置就会阻塞住,然后我们每敲一次n都会往下执行一行代码。  

      p  --->  打印:

     假如我们程序是这样

    #!/usr/bin/env python
    #coding:utf-8
    
    
    import pdb
    
    def a(msg):
        print "this is %s",msg
    
    def b(msg):
        print "this is %s"% msg
    
    def c(msg):
        print "this is %s"%msg
    
    def main():
        msg1 = 'a'
        msg2 = 'b'
        msg3 = 'c'
        print "start"
        pdb.set_trace()
        a(msg1)
        print "a is done"
        print "---------------"
        pdb.set_trace()
        b(msg2)
        print "b is done"
        print "---------------"
        pdb.set_trace()
        c(msg3)
        print "c is done"
        print "--------------"
        
    
    main()
    

     我们想打印变量的值,就可以这样

    root@SSS:/data/last/rebootMon/nbNet# python pdb_test.py 
    start
    > /data/last/rebootMon/nbNet/pdb_test.py(22)main()
    -> a(msg1)
    (Pdb) p msg1
    'a'
    (Pdb) 
    

       l  ---> 展示:

       

    root@SSS:/data/last/rebootMon/nbNet# python pdb_test.py 
    start
    > /data/last/rebootMon/nbNet/pdb_test.py(22)main()
    -> a(msg1)
    (Pdb) l
     17  	    msg1 = 'a'
     18  	    msg2 = 'b'
     19  	    msg3 = 'c'
     20  	    print "start"
     21  	    pdb.set_trace()
     22  ->	    a(msg1)
     23  	    print "a is done"
     24  	    print "---------------"
     25  	    pdb.set_trace()
     26  	    b(msg2)
     27  	    print "b is done"
    (Pdb) n
    this is %s a
    > /data/last/rebootMon/nbNet/pdb_test.py(23)main()
    -> print "a is done"
    (Pdb) n
    a is done
    > /data/last/rebootMon/nbNet/pdb_test.py(24)main()
    -> print "---------------"
    (Pdb) l
     19  	    msg3 = 'c'
     20  	    print "start"
     21  	    pdb.set_trace()
     22  	    a(msg1)
     23  	    print "a is done"
     24  ->	    print "---------------"
     25  	    pdb.set_trace()
     26  	    b(msg2)
     27  	    print "b is done"
     28  	    print "---------------"
     29  	    pdb.set_trace()
    

       b ---> 动态生成断点

           我们先重写代码

    #!/usr/bin/env python
    #coding:utf-8
    
    
    import pdb
    
    def a(msg):
        print "this is %s",msg
    
    def b(msg):
        print "this is %s"% msg
    
    def c(msg):
        print "this is %s"%msg
    
    def main():
        msg1 = 'a'
        msg2 = 'b'
        msg3 = 'c'
        print "start"
        while 1:
            pdb.set_trace()
            print "a is start"
            a(msg1)
            print "a is done"
            print "---------------"
            pdb.set_trace()
            print "b is start"
            b(msg2)
            print "b is done"
            print "---------------"
            pdb.set_trace()
            print "c is start"
            c(msg3)
            print "c is done"
            print "--------------"
        
    
    main()
    
    -> print "a is start"
    (Pdb) l
     18  	    msg2 = 'b'
     19  	    msg3 = 'c'
     20  	    print "start"
     21  	    while 1:
     22  	        pdb.set_trace()
     23  ->	        print "a is start"
     24  	        a(msg1)
     25  	        print "a is done"
     26  	        print "---------------"
     27  	        pdb.set_trace()
     28  	        print "b is start"
    (Pdb) b 25
    Breakpoint 1 at /data/last/rebootMon/nbNet/pdb_test.py:25
    (Pdb) n
    a is start
    > /data/last/rebootMon/nbNet/pdb_test.py(24)main()
    -> a(msg1)
    (Pdb) n
    this is %s a
    > /data/last/rebootMon/nbNet/pdb_test.py(25)main()
    -> print "a is done"
    (Pdb) n
    a is done
    > /data/last/rebootMon/nbNet/pdb_test.py(26)main()
    -> print "---------------"
    

    我们 输入 b25 增加了一个断点

    然后我们输入n 就跳到 25行。

    q --退出:

      退出交互

    ---使用动态变量

    (Pdb) !x = 123
    (Pdb) p x
    123
    

     

     

     

  • 相关阅读:
    [Error]错误 C2660: Gdiplus::GdiplusBase::operator new: 函数不带三个参数
    opengl多线程的问题
    去掉CFormView的滚动条
    DevIL库使用时图片翻转的问题
    让notepad++正确显示actionscript文件语法高亮
    [Error]world geometry is not supported by the generic scenemanager
    3d Max 9的"正在验证许可证"问题的解决
    CSizingControlBar Error C2440: “static_cast”: 无法从“UINT (__thiscall CSizingControlBarG::* )(CPoint)”转换为>>>
    MFC下的OpenGL
    酷!不用外挂,Win7资源监视器查看QQ好友IP
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/9040784.html
Copyright © 2020-2023  润新知