• python中调试pdb库用法详解


            pdb是ptyhon内置的一个调试库,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

            实际工作过程中都是采用linux远程ssh模式,无法可视化界面,那么调试技巧就是pdb。

    pdb调试常见命令:

     示例代码:

    1. def test(x):
    2. x = x + 1
    3. return x
    4. def test_debug():
    5. print('start')
    6. temp = 'my is str'
    7. print('ok')
    8. res = test(temp)
    9. print('end')
    10. test_debug()

            这段代码很简单,当我们执行test_debug()时,会执行test_debug函数并在该函数中调用另一个函数test(),test函数接收一个参数x并计算x+1的值传出。很明显传进去的参数temp是str,所以当执行上面一段代码时一定会报错.

    运行结果:

    接下来开始使用pdb开始调试。

            上图可以看到运行代码后,pdb的调试器控制台将从放置set_trace()的位置开始等待我们的命令,并且箭头标记指向pdb接下来要运行的行。

    接下来再使用pdb中常用命令:

     在弹出的文本框中输入n即可执行该行,并且箭头将指向下一行即将执行的代码。目前还没有到报错的位置,继续使用n或者直接回车重复执行上一个命令。

             使用p打印变量值,在Pdb中可以使用p + 变量名来查看变量值,比如查看变量temp的值;使用l查看上下行代码,在Pdb中可以使用l查看当前行上下几行代码.

             使用s进入子函数,来到出错的这一行,之所以报错就是传进去变量出了问题,因此可以在pdb交互行中使用s来进入子函数test().

             使用r执行函数直到结束,在pdb中可以使用r来执行当前运行函数到结束

             使用c停止调试并继续运行,现在我们修改相关代码完成调试,可以使用c命令继续执行命令,当然也可以输入q直接退出调试界面.

    pdb用法总结:

    1. # 导入
    2. import pdb
    3. # 设置断点
    4. pdb.set_trace()
    5. # -------------------
    6. # 断点命令
    7. p + 变量名 # 打印变量 或者直接变量名
    8. n # 执行下一行
    9. s # 进入函数
    10. r # 执行函数到结束
    11. c # 停止调试并继续运行
    12. q # 退出调试
    13. # enter 重复上一次命令

    补充:

     pdb命令行:

    1. 1)进入命令行Debug模式,python -m pdb xxx.py
    2. 2)h:(help)帮助
    3. 3)w:(where)打印当前执行堆栈
    4. 4)d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)
    5. 5)u:(up)执行跳转到当前堆栈的上一层
    6. 6)b:(break)添加断点
    7. b 列出当前所有断点,和断点执行到统计次数
    8. b line_no:当前脚本的line_no行添加断点
    9. b filename:line_no:脚本filename的line_no行添加断点
    10. b function:在函数function的第一条可执行语句处添加断点
    11. 7)tbreak:(temporary break)临时断点
    12. 在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样
    13. 8)cl:(clear)清除断点
    14. cl 清除所有断点
    15. cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
    16. cl lineno 清除当前脚本lineno行的断点
    17. cl filename:line_no 清除脚本filename的line_no行的断点
    18. 9)disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用
    19. 10)enable:激活断点,参数为bpnumber
    20. 11)s:(step)执行下一条命令
    21. 如果本句是函数调用,则s会执行到函数的第一句
    22. 12)n:(next)执行下一条语句
    23. 如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。
    24. 13)r:(return)执行当前运行函数到结束
    25. 14)c:(continue)继续执行,直到遇到下一条断点
    26. 15)l:(list)列出源码
    27. l 列出当前执行语句周围11条代码
    28. l first 列出first行周围11条代码
    29. l first second 列出first--second范围的代码,如果second
    30. 16)a:(args)列出当前执行函数的函数
    31. 17)p expression:(print)输出expression的值
    32. 18)pp expression:好看一点的p expression
    33. 19)run:重新启动debug,相当于restart
    34. 20)q:(quit)退出debug
    35. 21)j lineno:(jump)设置下条执行的语句函数
    36. 只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
    37. 22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束
    38. 23)condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效

    参考博文:python之pdb调试_Raymond。的博客-CSDN博客_pdb调试命令

  • 相关阅读:
    ip地址跟wifi有关系吗
    程序的编译和链接
    【云原生之K8s】 Pod基础概念
    FusionCharts Suite XT 3.19.1-2022-07-22
    Xception --tensorflow2.x
    【C++11保姆级教程】深入浅出异常说明符、异常操作符和lambda表达式
    网络编程基础知识总结——IP,端口,协议
    Java之SPI
    四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型
    【技术积累】JavaScript中的函数【一】
  • 原文地址:https://blog.csdn.net/weixin_44799217/article/details/125884722