Python调试新利器pdb++

什么是pdb++

pdb++是pdb标准库的拓展,它能完全兼容pdb,连之前的代码都不需要修改。

pdb++也是用于python调试的好工具,使用起来非常方便,就在想设置断点的地方加一行pdb.set_trace()即可。

安装pdb++

由于pdb++不是合法的package name,该包被命名为pdbpp

用pip安装:

1
$ pip install pdbpp

conda安装:

1
$ conda install -c conda-forge pdbpp

当然,你也可以把pdb.py放到自己的pythonpath里。

pdb++的使用

使用pdb++和使用pdb一样,就是:

1
2
3
4
5
6
7
import pdb

...

pdb.set_trace()

...

请注意,该模块名为 pdb.py,因此 pdb++ 将自动用于所有导入 pdb 的地方(例如 pytest –pdb 会给你一个 pdb++ 提示)。

旧的 pdb 模块仍然可以通过执行,例如:

1
2
3
4
5
6
7
import pdb

...

pdb.pdb.set_trace()

...

pdb++的常用指令

兼容了pdb的常用指令。

根据网络资料整理的常用的PDB命令

进入Debug模式

1
2
3
- 命令行: 进入命令行Debug模式,python -m pdb xxx.py
- sublime : Tools-->SublimeREPL-->python pdb
- jupyter: 使用魔法命令:%%debug

ipdb

1
python -m ipdb xxx.py

辅助命令

  • h:(help)帮助

运行

启动退出

  • run:重新启动debug,相当于restart

  • q:(quit)退出debug
    exit() 也可以

代码执行

  • s:(step)执行下一条命令

    如果本句是函数调用,则s会执行到函数的第一句

  • n:(next)执行下一条语句

    如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。

  • r:(return)执行当前运行函数到结束

  • c:(continue)继续执行,直到遇到下一条断点

  • j :(jump)设置下条执行的语句函数

    只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号

  • unt:(until)执行到下一行(跳出循环),或者当前堆栈结束

  • d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)

  • u:(up)执行跳转到当前堆栈的上一层

断点

  • b:(break)添加断点
1
2
3
4
5
6
7
b 列出当前所有断点,和断点执行到统计次数

b line_no:当前脚本的line_no行添加断点

b filename:line_no:脚本filename的line_no行添加断点

b function:在函数function的第一条可执行语句处添加断点
  • tbreak:(temporary break)临时断点

    在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样

  • cl:(clear)清除断点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
      cl 清除所有断点

    cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点

    cl lineno 清除当前脚本lineno行的断点

    cl filename:line_no 清除脚本filename的line_no行的断点

    - disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用

    - enable:激活断点,参数为bpnumber

    - condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效



    ### 打印查看

    - 输入变量名:查看变量值

    - w:(where)打印当前执行堆栈

    - l:(list)列出源码

    ```python
    l 列出当前执行语句周围11条代码

    l first 列出first行周围11条代码

    l first second 列出first--second范围的代码,如果second<first,second将被解析为行数
  • a:(args)列出当前执行函数的参数

  • p expression:(print)输出expression的值

  • pp expression:好看一点的p expression
    ————————————————
    版权声明:本文为CSDN博主「sunpro518」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sunjinshengli/article/details/104155455

pdb++的优势

智能命令解析

使用pdb的时候,如果你有个变量c,想看它的值,那么pdb就会显得很笨。它会优先把这个c识别为continue,而不是你的变量。

pdb++则解决了这个问题,它始终将你的指令优先翻译成域内的变量(如果存在)。当然,在你想使用continue等指令时,也可以加上两个!!来实现。例如:

1
2
3
4
5
6
7
8
9
(Pdb++) list
1
2 def fn():
3 c = 42
4 import pdb;pdb.set_trace()
5 -> return c
(Pdb++) c
42
(Pdb++) !!c

其他优势

详见github地址:https://github.com/pdbpp/pdbpp

参考链接


https://www.cnblogs.com/c-x-a/p/10674288.html

https://blog.csdn.net/sunjinshengli/article/details/104155455

https://github.com/pdbpp/pdbpp

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2023 glisses
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信