python内置的调试工具-pdb

最近写python代码,当代码逻辑复杂时,总是要检查是否正确运行。但是光用print显得较为麻烦,在网上找到了内置的调试工具pdb,使用起来比print要舒服,因此特来总结一下pdb的使用。

pdb有两种使用方法:

  • 非侵入式(不需要额外修改源代码,在命令行下直接运行即可调试):

    python -m pdb filename.py
    
  • 侵入式(在调试代码中添加一行代码,之后在正常运行)

    import pdb
    pdb.set_trace()
    
    python filename.py
    
  • 当命令行前面出现(pdb)时,就表示调试工具pdb启动成功。

    当前所在位置会用->进行标注,表示即将访问该行代码

    查看源码

    l:查看当前位置前后11行源代码。

    l:查看全部源代码。

    设置断点

    b:添加断点

  • b line_num:在line_num处添加断点
  • b filename:line_num:在filename文件的line_num行添加断点
  • b function_name:在function_name处添加断点
  • tbreak:添加临时断点(执行一次后自动删除)

    cl:清除断点

  • cl filename:line_num
  • cl bp_number1 .. bp_number_n:清除1-n的断点序号
  • 非逐行调试命令

    c:持续执行下去,直到遇到一个断点

    unt line_num:持续执行直到到达指定行或遇到断点。

    j:直接跳转到指定行(被跳过的代码不执行

    until 命令用于跳过代码,直到到达指定的行号。但是,如果你指定的行号小于当前行号,PDB 会报错。

    jump 命令用于跳转到指定的行号,但它有一些限制:

  • 你只能跳转到当前代码块内的行号。
  • 你不能跳转到比当前行号更早的行号(即不能倒退)。
  • 逐行调试命令

    s:执行下一行,可以进入函数体

    n:执行下一行,不会进行函数体

    r:执行下一行。若在函数内则会直接执行到函数返回处

    打印变量

    p var1 .. var_n:打印变量值。

    打印变量类型

    whatis var

    启动交互式解释器

    interact

    退出交互模式:

  • Linux/MacCtrl + D
  • Windows: Ctrl + Z
  • 退出pdb

    q

    修改变量
    1. !var = new_var
    2. var = new_var

    var = new_var:普通赋值语句,可能被 pdb 解析为命令。
    !var = new_var:强制解释为 Python 代码,避免与 pdb 命令冲突。
    在调试时,如果变量名或值与 pdb 命令冲突,建议使用 ! 来确保代码的正确执行。

    将调试的输入输出信息进行保存

    pdb调试可以在终端上很容易就看到调试的信息,但是在分析的时候可能由于对调试信息有缺漏导致判断错误。因此可以将调试的输入输出不仅展示在终端上,还进行保存,方便进一步检查。

    {使用pdb进行调试的指令} | tee debug.log

    tee 是一个在 Unix/Linux 系统中常用的工具,可以将命令的输出同时保存到文件和终端。结合 tee,可以将 PDB 的交互式输入和输出全部保存到日志文件中。

    (base) PS E:\Graduate\ML_PDE\ML> python .\lab.py | tee debug.log
    > e:\graduate\ml_pde\ml\lab.py(4)<module>()
    -> a = [1,3,3,4,5,6,7,8,9,10]
    unt 15
    (Pdb) > e:\graduate\ml_pde\ml\lab.py(15)<module>()
    -> main(a)
    p a,b
    (Pdb) ([1, 3, 3, 4, 5, 6, 7, 8, 9, 10], array([[0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.]]))
    whatis a
    (Pdb) <class 'list'>
    whatis b
    (Pdb) <class 'numpy.ndarray'>
    q
    Traceback (most recent call last):
      File "E:\Graduate\ML_PDE\ML\lab.py", line 15, in <module>
        main(a)
      File "E:\Graduate\ML_PDE\ML\lab.py", line 15, in <module>
        main(a)
      File "E:\Anacoda_store\lib\bdb.py", line 90, in trace_dispatch
        return self.dispatch_line(frame)
      File "E:\Anacoda_store\lib\bdb.py", line 115, in dispatch_line
        if self.quitting: raise BdbQuit
    bdb.BdbQuit
    (Pdb) 
    

    10分钟教程掌握Python调试器pdb – 知乎 (zhihu.com)

    作者:golemon.

    物联沃分享整理
    物联沃-IOTWORD物联网 » python内置的调试工具-pdb

    发表回复