python 中断点调试 pdb 包的介绍及使用

pdb 的简介

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 = 0for 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 + breturn sumif __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 = 0for 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 + breturn sumif __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]                               # 执行程序知道遇到断点时停止(此时是第1for循环中) 
(Pdb) l                                               # l命令 列出当前文件的源代码 1     # 对items的所有元素求和并返回                    # ->表示下一行将要执行的命令即item=items_list[i],上一行已执行完2     def sum_list(items):3         items_sum = 04         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_sum910     # 对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]=11
(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命令 继续运行,仅在遇到断点时停止(跳转到第2for循环中)
> f:\code\ceshi\ceshi.py(5)sum_list()
-> import pdb; pdb.set_trace()
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第3for循环中)
> f:\code\ceshi\ceshi.py(6)sum_list()
-> item = items_list[i]
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第4for循环中)
> f:\code\ceshi\ceshi.py(5)sum_list()
-> import pdb; pdb.set_trace()
(Pdb) c                                              # c命令 继续运行,仅在遇到断点时停止(跳转到第5for循环中)
> 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 = 04         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_sum910     # 对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的值(第5for循环)
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的值(第5for循环后:所有元素相加得到的总值)
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_listfor i in range(len(items_list)):File "F:\Code\ceshi\ceshi.py", line 4, in sum_listfor i in range(len(items_list)):File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 88, in trace_dispatchreturn self.dispatch_line(frame)File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 113, in dispatch_lineif self.quitting: raise BdbQuit
bdb.BdbQuit
(base) PS F:\Code\ceshi> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django、Python版本升级问题大汇总

Django3.0升级到4.1,Python3.8升级到3.11.6问题大汇总 报错1:ERROR: Could not build wheels for cffi, uWSGI, which is required to install pyproject.toml-based projects ERROR: Could not build wheels for cffi, uWSGI, which is required to install pyproject.tom…

golang 图片加水印,字体文件从哪里找

鼠标左键双击此电脑图标在此电脑文本框输入电脑默认字体地址&#xff1a;C:\Windows\Fonts找到需要用到的字体文件&#xff0c;复制到指定文件夹

python企业车辆车货信息平台 s05fw

车货信息平台系统可具体分为货源方、平台方、承运方三部分。其中前端要求包含货源方&#xff1a;发布货源信息、选择承运方、司机服务评价&#xff1b;平台方&#xff1a;账户管理、货主、司机资质审核、聊天功能&#xff1b;承运方&#xff1a;车辆信息上传、个人车主发布车源…

Ubuntu Desktop 死机处理

Ubuntu Desktop 死机处理 当 Ubuntu Desktop 死机时&#xff0c;除了长按电源键重启&#xff0c;还可以使用如下两种方式处理。 方式1&#xff1a;ctrlaltFn 使用 ctrl alt F3~F6: 切换到其他 tty 命令行。 执行 top 命令查看资源占用最多的进程&#xff0c;然后使用 kill…

HEX报文协议打包生成工具

本工具可以用于灵活定制各种格式的报文。以下是定制报文中每个字段的说明&#xff1a; isbig&#xff1a;指示报文中的字节顺序是否为大端序&#xff08;Big Endian&#xff09;。如果为true&#xff0c;则表示使用大端序&#xff1b;如果为false&#xff0c;则表示使用小端序…

centrifuge5.0.1版本请求websocket实例

目录 一、安转 二、快速开始 三、实例开始 centrifuge提供了一个客户端&#xff0c;可使用纯 WebSocket 或一种替代传输&#xff08;HTTP 流、SSE/EventSource、实验性 WebTransport&#xff09;从 Web 浏览器、ReactNative 或 NodeJS 环境连接到Centrifugo或任何基于 Cent…

WorkPlus局域网即时通讯软件的领航者,连接高效协作的利器

在快速发展的商业环境中&#xff0c;高效的内部沟通和协作对于企业的成功至关重要。而局域网即时通讯软件则成为实现内部高效沟通的必备工具。作为一款领航者级别的局域网即时通讯软件&#xff0c;WorkPlus通过卓越的性能和创新的技术&#xff0c;成为了众多企业的首选之一。 W…

ggplot2 | line plot 分组及均值线:聚类后的表达变化趋势图

1. 效果图 2. 预处理及绘图 # 输入数据 > head(dat)Species cid variable value 1 setosa 1 Sepal.Length 5.1 2 setosa 2 Sepal.Length 4.9 3 setosa 3 Sepal.Length 4.7 4 setosa 4 Sepal.Length 4.6 5 setosa 5 Sepal.Length 5.0 6 setos…

selenium模块有哪些用途?

Selenium模块是一个用于Web应用程序测试的模块&#xff0c;具有多种示例用法。以下是一些示例&#xff1a; 1.打开网页并执行一些基本操作&#xff0c;如点击按钮、输入文本等。 定位网页元素并执行操作&#xff0c;例如使用 find_element 方法查找单个元素&#xff0c;使用 f…

2023第三届中国高校大数据挑战赛B题代码

任务已完成&#xff0c;聚类效果很好&#xff08;主要在于数据的处理以及特征工程&#xff09;, 需代码si&#xff0c;yuer有限先到先得。

Git 使用规范:起名字、提交描述的最佳实践

1. 推荐写法&#xff08;本人常用&#xff09; Git 仓库命令规则&#xff1a; 前端&#xff1a;系统名-简单描述-front后端&#xff1a;系统名-简单描述-server Git 提交描述&#xff1a; docs(changelog): update change log to beta.5其中&#xff1a; ● docs 则对应修改…

深度学习 | 基本循环神经网络

1、序列建模 1.1、序列数据 序列数据 —— 时间 不同时间上收集到的数据&#xff0c;描述现象随时间变化的情况。 序列数据 —— 文本 由一串有序的文本组成的序列&#xff0c;需要进行分词。 序列数据 —— 图像 有序图像组成的序列&#xff0c;后一帧图像可能会受前一帧的影响…

Linux 服务器安全策略技巧:使用容器进行应用程序隔离

Linux 服务器安全策略技巧:使用容器进行应用程序隔离 什么是容器? 容器是一种虚拟化技术,用于隔离应用程序和其依赖的运行环境。与传统的虚拟机相比,容器更加轻量级,启动速度更快,并且可以在不同的操作系统上运行。容器使用操作系统级别的虚拟化来实现隔离,每个容器都…

09.kubernetes 部署calico / flannel网络插件

脚本中实现了 calico 和 flannel 这两种主流的网络插件,选择其中一种部署即可 1、calico calico架构 Calico是一个三层的虚拟网络解决方案,它把每个节点都当作虚拟路由器(vRouter),并把每个节点上的Pod都当作是节点路由器后的一个终端设备并为其分配一个IP地址。各节点…

TCP/IP的五层网络模型

目录 封装&#xff08;打包快递&#xff09; 6.1应用层 6.2传输层 6.3网络层 6.4数据链路层 6.5物理层 分用&#xff08;拆快递&#xff09; 6.5物理层 6.4数据链路层 6.3网络层 6.2传输层 6.1应用层 封装&#xff08;打包快递&#xff09; 6.1应用层 此时做的数据…

Xshell——Windows将本地文件上传到Linux服务器

1、scp命令 scp是基于ssh的网络文件传输命令&#xff0c;可以将本地文件或文件夹直接上传到服务器指定位置。命令格式&#xff1a; 上传文件 scp -P port filepath usernameip:TargetPath 上传文件夹 scp -r -P port filepath usernameip:TargetPath -P port&#xff1a;用于指…

java中如何使用elasticsearch—RestClient操作文档(CRUD)

目录 一、案例分析 二、Java代码中操作文档 2.1 初始化JavaRestClient 2.2 添加数据到索引库 2.3 根据id查询数据 2.4 根据id修改数据 2.4 删除操作 三、java代码对文档进行操作的基本步骤 一、案例分析 去数据库查询酒店数据&#xff0c;导入到hotel索引库&#xff0…

普通人如何月入过万?2024普通人创业适合干什么?

如果你的月收入不到1万块&#xff0c;也从来没有体验过一天就赚1万块是什么感觉的话&#xff0c;你还想创业&#xff1f;你如果想通过创业逆天改命&#xff0c;麻烦你一定要看完这篇文章。 普通人你要是想赚钱&#xff0c;一定要去赚那种能看得见的钱。 什么叫看得见的钱&…

Linux上管理不同版本的 JDK

当在 Linux 上管理不同版本的 JDK 时&#xff0c;使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11&#xff0c;并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…

第十二章 文档对象模型(DOM)的介绍和使用

文章目录 一、DOM介绍二、节点选择器三、属性操作四、样式操作五、尺寸类属性的快速获取六、标签操作八、练习 一、DOM介绍 DOM&#xff1a;文档对象模型&#xff0c;document&#xff0c;提供了网页的相关操作。 document是window的子对象之一&#xff0c;但是DOM不属于BOM D…