Python中断点调试pdb包的用法详解

 更新时间:2024年01月03日 16:18:50   作者:kevin小新  
pdb(python debugger) 是 python 中的一个命令行调试包,为 python 程序提供了一种交互的源代码调试功能,下面就跟随小编一起学习一下它的具体使用吧

pdb(python debugger) 是 python 中的一个命令行调试包,为 python 程序提供了一种交互的源代码调试功能,其官方使用文档链接为 pdb — Python 的调试器

pdb 的主要功能包括设置断点、单步调试、进入函数调试、查看当前代码、查看变量、栈片段的值等,从而可以减少或者避免使用 print 和 log 等杂乱繁琐的方式进行 python 代码的调试。

安装及使用方法

pdb 包的安装方法很简单,直接在环境中通过下面的 pip 即可安装:

pip install pdb

pdb 包的使用方法也很简单,直接在代码中想要进入调试器的地方插入下面两行命令,然后保存并再次执行当前 python 文件就可以自动跳转到该断点位置,然后便可以自行打印出相关内容进行调试。

import pdb
pdb.set_trace()
# 也可以将上面两行写在一行,通过;号分隔
import pdb; pdb.set_trace()

pdb 常用命令

当在代码中添加了上述的两行命令运行程序后,程序会自动跳转至代码所在断点位置,下面便可以在终端中查看相应的变量进行调试。进入 pdb 调试断点模式后,可以使用命令来控制调试和检查程序的状态,pdb 中一些常用命令如下:

命令解释
next 或 n继续运行,直到运行到当前函数的下一行
step 或 s运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下
continue 或 c继续执行程序,直到遇到下一个断点
list 或 l列出当前文件的源代码
p XXX打印变量或者表达式的值(XXX为变量或表达式的名称)
print(XXX) 也可以使用,但它不是一个调试器命令它执行 Python 中的 print() 函数打印变量XXX的值
return 或 r继续执行代码,直到当前函数返回
quit 或 q退出调试器,被执行的程序将被中止
break 或 b设置断点
help帮助

调试代码示例

下面是一个简单的对 list 的列表 items_list 中所有元素求和并返回的代码示例,为了通过示例进行演示,博主将 list 中元素求和写在 sum_list(items) 函数中,并将两元素相加(+)又写成了一个函数 sum_ab(a, b) ,下面的代码是原始的代码:

# 对items的所有元素求和并返回
def sum_list(items):
    items_sum = 0
    for i in range(len(items_list)):
        item = items_list[i]
        items_sum = sum_ab(items_sum, item)
    return items_sum

# 对a和b两个元素进行求和
def sum_ab(a, b):
    sum = a + b
    return sum

if __name__ == "__main__":
    items_list = [1, 2, 3, 4, 5]
    items_sum = sum_list(items_list)
    print("items_sum求和所得的结果为:", items_sum)

在上述代码中 sum_list(items) 函数中添加调试 import pdb; pdb.set_trace() 命令用于设置断点。

# 对items的所有元素求和并返回
def sum_list(items):
    items_sum = 0
    for i in range(len(items_list)):
        import pdb; pdb.set_trace()
        item = items_list[i]
        items_sum = sum_ab(items_sum, item)
    return items_sum

# 对a和b两个元素进行求和
def sum_ab(a, b):
    sum = a + b
    return sum

if __name__ == "__main__":
    items_list = [1, 2, 3, 4, 5]
    items_sum = sum_list(items_list)
    print("items_sum求和所得的结果为:", items_sum)

开始调试:运行上面的添加 pdb 命令的程序后,程序会停留在 pdb.set_trace() 处,并且命令行的左端由 (base) 会变成 (pdb) 提示当前进入了 pdb 调试模式。
由于 items_list 共包含 5 个元素,所以 sum_list(items) 函数中 for 循环共执行 5 次就会得到结果并返回到主函数。

下面的过程就是将一些常用的 pdb 命令执行的结果,博主将每行代码的作用通过 # 功能 的形式写在每行代码的右侧,方便大家理解。

(base) PS F:\Code\ceshi> python ./ceshi.py            # 运行当前添加了import pdb; pdb.set_trace()的程序
> f:\code\ceshi\ceshi.py(6)sum_list()
-> item = items_list[i]                               # 执行程序知道遇到断点时停止(此时是第1次for循环中) 
(Pdb) l                                               # l命令 列出当前文件的源代码 
  1     # 对items的所有元素求和并返回                    # ->表示下一行将要执行的命令即item=items_list[i],上一行已执行完
  2     def sum_list(items):
  3         items_sum = 0
  4         for i in range(len(items_list)):
  5             import pdb; pdb.set_trace()
  6  ->         item = items_list[i]                                                 
  7             items_sum = sum_ab(items_sum, item)
  8         return items_sum
  9
 10     # 对a和b两个元素进行求和
 11     def sum_ab(a, b):
(Pdb) n                                              # n命令 继续运行,直到运行到当前函数的下一行(当前行item=items_list[i]已执行完,并且->移动到下一行)
> f:\code\ceshi\ceshi.py(7)sum_list()
-> items_sum = sum_ab(items_sum, item)
(Pdb) p item                                         # p命令 打印变量item的值(第一次for循环,item为=items_list[0]=1)
1
(Pdb) s                                              # s命令 运行当前行,在被调用的sum_ab(a,b)函数内部停下
--Call--
> f:\code\ceshi\ceshi.py(11)sum_ab()
-> def sum_ab(a, b):
(Pdb) r                                              # r命令 继续执行代码,直到当前函数sum_ab(a,b)返回
--Return--
> f:\code\ceshi\ceshi.py(13)sum_ab()->1
-> return sum
(Pdb) p sum                                          # p命令 打印变量sum的值(sum是sum_ab(a,b)返回的值,items_list[0]第一个元素求和的结果)
1
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第2次for循环中)
> f:\code\ceshi\ceshi.py(5)sum_list()
-> import pdb; pdb.set_trace()
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第3次for循环中)
> f:\code\ceshi\ceshi.py(6)sum_list()
-> item = items_list[i]
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第4次for循环中)
> f:\code\ceshi\ceshi.py(5)sum_list()
-> import pdb; pdb.set_trace()
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第5次for循环中)
> f:\code\ceshi\ceshi.py(6)sum_list()
-> item = items_list[i]
(Pdb) l                                              # l命令 列出当前文件的源代码
  1     # 对items的所有元素求和并返回
  2     def sum_list(items):
  3         items_sum = 0
  4         for i in range(len(items_list)):
  5             import pdb; pdb.set_trace()
  6  ->         item = items_list[i]
  7             items_sum = sum_ab(items_sum, item)
  8         return items_sum
  9
 10     # 对a和b两个元素进行求和
 11     def sum_ab(a, b):
(Pdb) n                                              # n命令 继续运行,直到运行到当前函数的下一行(->移动到下一行)            
> f:\code\ceshi\ceshi.py(7)sum_list()
-> items_sum = sum_ab(items_sum, item)
(Pdb) p item                                         # p命令 打印变量item的值(第5次for循环)
5
(Pdb) n                                              # n命令 继续运行,直到运行到当前函数的下一行(->移动到下一行) 
> f:\code\ceshi\ceshi.py(4)sum_list()
-> for i in range(len(items_list)):
(Pdb) p items_sum                                    # p命令 打印变量items_sum的值(第5次for循环后:所有元素相加得到的总值)
15
(Pdb) q                                              # q
Traceback (most recent call last):
  File "F:\Code\ceshi\ceshi.py", line 17, in <module>
    items_sum = sum_list(items_list)
  File "F:\Code\ceshi\ceshi.py", line 4, in sum_list
    for i in range(len(items_list)):
  File "F:\Code\ceshi\ceshi.py", line 4, in sum_list
    for i in range(len(items_list)):
  File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 88, in trace_dispatch
    return self.dispatch_line(frame)
  File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 113, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit
(base) PS F:\Code\ceshi> 

以上就是Python中断点调试pdb包的用法详解的详细内容,更多关于Python断点调试pdb的资料请关注脚本之家其它相关文章!

相关文章

  • python中pygame安装不成功的解决办法

    python中pygame安装不成功的解决办法

    尽管网上搜到许多篇关于pycharm如何安装pygame库,但是跟着要求做还是安装失败,下面这篇文章主要给大家介绍了关于python中pygame安装不成功的解决办法,需要的朋友可以参考下
    2023-05-05
  • python matplotlib实现双Y轴的实例

    python matplotlib实现双Y轴的实例

    今天小编就为大家分享一篇python matplotlib实现双Y轴的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python函数基础(定义函数、函数参数、匿名函数)

    Python函数基础(定义函数、函数参数、匿名函数)

    这篇文章介绍了Python函数的基础用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 一文深入理解Python的对象模型

    一文深入理解Python的对象模型

    Python程序中的所有数据都由对象或对象之间的关系表示,下面这篇文章主要介绍了Python对象模型的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • 将Python应用部署到生产环境的小技巧分享

    将Python应用部署到生产环境的小技巧分享

    文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完善、文档更新、环境搭建、自动化流水线、性能调优、监控与告警、安全加固以及故障恢复
    2025-01-01
  • matplotlib阶梯图的实现(step())

    matplotlib阶梯图的实现(step())

    这篇文章主要介绍了matplotlib阶梯图的实现(step()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python如何实现强制数据类型转换

    Python如何实现强制数据类型转换

    这篇文章主要介绍了Python如何实现强制数据类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Python中隐藏的五种实用技巧分享

    Python中隐藏的五种实用技巧分享

    这篇文章主要和大家分享五个Python中隐藏的实用技巧,文中的示例代码讲解详细,对我们学习Python有一定的帮助,感兴趣的小伙伴可以学习一下
    2022-05-05
  • Python脚本实现Web漏洞扫描工具

    Python脚本实现Web漏洞扫描工具

    这是去年毕设做的一个Web漏洞扫描小工具,主要针对简单的SQL注入漏洞、SQL盲注和XSS漏洞。下文给大家介绍了使用说明和源代码,一起看看吧
    2016-10-10
  • 如何用Python实现简单的Markdown转换器

    如何用Python实现简单的Markdown转换器

    这篇文章主要介绍了如何用Python实现简单的Markdown转换器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07

最新评论