首页 > 编程 > Python > 正文

python pdb 调试

2019-11-11 02:03:36
字体:
来源:转载
供稿:网友
python pdb调试

在交互环境中通常使用pdb.run来调试:

?
import pdbdef pdb_test(arg):    fori in range(arg):        PRint(i)    returnargpdb.run("pdb_test(3)")

b 函数名、行号

     打断点,b可以查询所有的断点。

?
(Pdb) b pdb_testBreakpoint 1 at c:/users/plpcc/desktop/pdbtest.py:3(Pdb) bNum Type        Disp Enb   Where1   breakpoint   keep yes   at c:/users/plpcc/desktop/pdbtest.py:3

  c:

     运行程序,直到遇到断点。

?
(Pdb) c> c:/users/plpcc/desktop/pdbtest.py(4)pdb_test()->for i in range(arg):

   l:

     查看断点周围的代码

?
(Pdb) l  1    import pdb  2     3B   def pdb_test(arg):  4 ->      fori in range(arg):  5            print(i)  6        return arg  7     8    pdb.run("pdb_test(3)")

  a:

     查看参数

?
(Pdb) aarg =3

  s, n:

     单步运行,区别s会进入路径中的函数,n不会进入

  p:

     查看表达式的值

?
(Pdb) p i0

  condition:

     条件断点,只有条件为true断点才命中

?
> c:/users/plpcc/desktop/pdbtest.py(5)pdb_test()->print(i)(Pdb) l  1    import pdb  2     3    def pdb_test(arg):  4        for i inrange(arg):  5B->         print(i)  6        return arg  7     8    pdb.run("pdb_test(3)")[EOF](Pdb) bNum Type        Disp Enb   Where2   breakpoint   keep yes   at c:/users/plpcc/desktop/pdbtest.py:5(Pdb) condition2 i==1  //i==1时才触发断点2New condition set forbreakpoint 2.(Pdb) bNum Type        Disp Enb   Where2   breakpoint   keep yes   at c:/users/plpcc/desktop/pdbtest.py:5    stop onlyif i==1(Pdb) c0                      //i==0直接打印未断住> c:/users/plpcc/desktop/pdbtest.py(5)pdb_test()->print(i)            //触发断点,i==1(Pdb) p i1

  bt:

      查看调用堆栈

?
(Pdb) bt  c:/python33/lib/bdb.py(405)run()->exec(cmd, globals, locals)  <string>(1)<module>()> c:/users/plpcc/desktop/pdbtest.py(5)pdb_test()->print(i)

  r:

      执行到函数返回

?
(Pdb) r12--Return--> c:/users/plpcc/desktop/pdbtest.py(6)pdb_test()->3//代码位置、函数返回值->3->return arg                                      //代码位置的语句(Pdb) l  1    import pdb  2     3    def pdb_test(arg):  4        for i inrange(arg):  5            print(i)  6 ->      returnarg  7     8    pdb.run("pdb_test(3)")

通过pdb.set_trace() 在代码中指定位置嵌入一个断点,通常可以通过调试开关来控制

?
import pdb__DEBUG__ = Truedef pdb_test(arg):    ifTrue ==__DEBUG__:        pdb.set_trace()    fori in range(arg):        print(i)    returnargpdb_test(3)

运行后在pdb.set_trace()位置被断住,当__DEBUG__ = False,代码正常运行

?
> c:/users/plpcc/desktop/pdbtest.py(8)pdb_test()->for i in range(arg):(Pdb) l  3    __DEBUG__ =True  4     5    def pdb_test(arg):  6        if True == __DEBUG__:  7            pdb.set_trace()  8 ->      fori in range(arg):  9            print(i)10        return arg11   12    pdb_test(3)[EOF]

通过pdb.pm()进行事后调试,可以跟踪异常程序最后的堆载信息:

?
Traceback (most recent call last):  File"C:/Users/plpcc/Desktop/pdbTest.py", line13, in<module>    pdb_test(3)  File"C:/Users/plpcc/Desktop/pdbTest.py", line10, inpdb_test    1/0ZeroDivisionError: division by zero>>> importpdb>>> pdb.pm()> c:/users/plpcc/desktop/pdbtest.py(10)pdb_test()->1/0(Pdb) l  5    def pdb_test(arg):  6        if True == __DEBUG__:  7            pdb.set_trace()  8        for i inrange(arg):  9            print(i)10 ->          1/011        return arg12   13    pdb_test(3)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表