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

 

 

 

原文地址:https://www.cnblogs.com/nerdlerss/p/9040784.html