python调试器 ipdb

news2025/1/23 10:20:39

文章目录

        • 1. 介绍
          • 1.1 常用调试方式
          • 1.2 安装 ipdb
        • 2. 用法
        • 3. 命令
          • 3.1、查看源代码
          • 3.2、添加断点
          • 3.3 添加临时断点
          • 3.4 清除断点
          • 3.5、打印变量值
          • 3.6、逐行调试命令
          • 3.7、非逐行调试命令
          • 3.8 跳出函数,跳入函数
          • 3.9、查看当前函数所有参数
          • 3.10 打印变量的值
          • 3.11、打印变量类型
          • 3.12、启动交互式解释器
          • 3.13、打印堆栈信息
          • 3.14、退出pdb
          • 3.15 注意
        • 4. 实例
        • 5. 第二种方法(侵入式调试)
        • 6. 总结
        • 7. 参考链接

1. 介绍

Pdb是一个交互式的调试工具,集成于Python标准库中

Pdb能让你根据需求跳转到任意的Python代码断点、查看任意变量、单步执行代码,甚至还能修改变量的值,而不必重启程序

⚠️pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。

而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具,如PyCharm IDE。

手册:https://docs.python.org/3.5/library/pdb.html#pdbcommand-where

pdb的使用方式和ipdb是一样的(ipdb是增强版的pdb)

1.1 常用调试方式
  • 用眼睛直接看代码出错在哪里
  • print/logging 大法好
  • Pycharm 专业的 IDE 断点调试
  • pdb/ipdb,好处是可以在终端和服务器上使用,调试期间可以使用 pdb 各种命令和python 自带的 print, pprint, vars, dir, locals() 等辅助调试
1.2 安装 ipdb
pip install ipdb

2. 用法

pdb有2种用法:

2.1、非侵入式方法(不用额外修改源代码,在命令行下直接运行就能调试,建议这样用哦)

python3 -m pdb filename.py

注意:-m参数,这样调用 filename.py的话断点就是程序的执行第一行之前,然后再使用调试命令进行程序调试

2.2、侵入式方法(需要在被调试的代码中添加一行代码然后再正常运行代码)

import pdb;
pdb.set_trace()

当你在命令行看到下面这个提示符时,说明已经正确打开了pdb

(Pdb)

3. 命令

现在你已经进入了单步执行模式,然后就可以开始输入pdb命令了,下面是pdb的常用命令:

3.1、查看源代码

3.1.1 命令:

l

说明:

l是list的缩写:默认查看当前位置前后11行源代码(多次会翻页)
当前位置在代码中会用–>这个符号标出来

3.1.2 命令:

查看第start到end行的代码,指定具体的范围

l start,end  

例如:l 1,18 : list 1,18的缩写,查看第1行到18行的代码

3.1.3 命令:

ll

说明:

查看当前函数或框架的所有源代码

3.2、添加断点

命令:

b
b line_no
b file_name:line_no 
b function_name

参数:

  • filename文件名,断点添加到哪个文件,如test.py
  • lineno断点添加到哪一行
  • function:函数名,在该函数执行的第一行设置断点

重点注意第3行,表示在脚本filename的line_no行添加断点。
但其实第2行更实用。

说明:

  1. 不带参数表示查看断点设置
  2. 带参则在指定位置设置一个断点
3.3 添加临时断点

命令:

tbreak
tbreak lineno
tbreak filename:lineno
tbreak functionname

参数:

同b命令的参数

说明:

  • 执行一次后时自动删除(这就是它被称为临时断点的原因)
3.4 清除断点

命令1:

cl
cl filename:lineno
cl bpnumber [bpnumber ...]

参数:

bpnumber 断点序号(多个以空格分隔)

说明:

  • 1.不带参数用于清除所有断点,会提示确认(包括临时断点)
  • 2.带参数则清除指定文件行或当前文件指定序号的断点

命令2:

disable/enable :禁用/激活断点

disable/enable
3.5、打印变量值

命令:

p expression

参数:

expression:Python表达式
注意,也可以直接使用变量名直接打印出来,除了这些变量名与ipdb的命令名一样时,可以使用 p 来把变量名打印出来

3.6、逐行调试命令

包括 s ,n , r 这3个相似的命令,区别在如何对待函数上

3.6.1 命令1:

s : step的缩写,能进入函数内部

s

说明:

执行下一行(能够进入函数体)

3.6.2 命令2:

n : next的缩写,执行下一步;如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的

n

说明:

执行下一行(不会进入函数体)

3.6.3 命令3:

r:return的缩写,继续运行,直到函数返回,结束该函数的运算

r

说明:

执行当前运行函数到结束

3.7、非逐行调试命令

3.7.1 命令1:

c

说明:

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

3.7.2 命令2

unt lineno

说明:

持续执行直到运行到指定行(或遇到断点)

3.7.3 命令3

j lineno

说明:

让程序跳转到指定的行数 ,能够跳过中间某些行代码的执行。

注意:但是必须跳转到的地方在当前的代码块中

3.8 跳出函数,跳入函数

3.8.1 命令1

u

说明:

u : up的缩写,跳回上一层(函数)的调用

3.8.2 命令2

down

说明:

d : down的缩写,跳回之前调用到的下一层的位置(跟up命令搭配使用)

3.9、查看当前函数所有参数

命令:

a

说明:

args 的缩写,在函数中时打印函数的参数和参数的值。

3.10 打印变量的值

p 或 pp expression: 打印变量的值,两者的不同是p用的是print(),pp用的是pprint()

3.11、打印变量类型

命令:

whatis expression

说明:

打印表达式的类型,常用来打印变量值类型

3.12、启动交互式解释器
interact

说明:

启动一个python的交互式解释器,使用当前代码的全局命名空间(使用ctrl+d(或者ctrl+z)返回pdb)

3.13、打印堆栈信息
w

说明:

where的缩写,打印堆栈信息,最新的帧在最底部。箭头表示当前帧。

3.14、退出pdb
q或者exit(),quit 
3.15 注意

注意:

1:直接输入Enter,会执行上一条命令;

2:输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行;
3:h(elp)能够查看调试命令的用法,比如h h可以查看h(elp)命令的用法,h jump能够查看j(ump)命令的用法

4. 实例

#test.py

s = '0'
n = int(s)
print(10/n)

打开命令行运行test.py

python -m pdb test.py

ipdb

pdb定位到下一步要执行的代码-----> s = ‘0’,

输入命令l,就是命令l(list)来查看前后上下文10行代码:

ipdb

输入命令n可以单步执行代码:

ipdb

还可以输入p 变量名来查看变量:

ipdb

但是这个变量所在的代码必须是运行过之后才能查看,否则,会出现找不到变量的情况,如下:

ipdb

运行test.py到第二行代码 n = int(s) 这行代码实际还未执行。此时查看变量n会提示找不到变量。

输入命令q结束调试,退出程序:

ipdb

5. 第二种方法(侵入式调试)

pdb单步执行太麻烦了,所以第二种方法是import pdb 之后,直接在代码里需要调试的地方放一个pdb.set_trace(),就可以设置一个断点。

程序会在pdb.set_trace()暂停并进入pdb debug调试环境,在该模式中,我们可使用调试命令,如next或缩写n实现单步执行;也可以查看Python变量,或是运行Python代码。

如果Python变量名和调试命令冲突,需在变量名前加!或者 p 以及 pp ,这样ipdb会执行对应的Python命令,而不是pdb调试命令。

上面的方式虽然简单,但是存在着两个较为比较明显的问题:

  • 插入的断点代码会污染原来的代码空间
  • 每次插入断点都需要修改源码

修改下上面的实例如下,import pdb, 添加了pdb.set_trace()到可能出错的代码前面:

#test.py

import pdb

s = '0'
n = int(s)
pdb.set_trace() #运行到这里会自动暂停
print(10/n)

运行之后,程序到断点的下一行代码就暂停了,如下图所示:

ipdb

6. 总结

在pytorch中使用ipdb可以对程序实现单步调试等,使用命令pip install ipdb安装即可。
在需要调试的代码前面加上ipdb.set_trace()即可,当程序运行到这一步的时候,自动进入调试模式或者在命令行加上-m pdb,例如采用next或者缩写n进行单步执行,如果程序中有跟调试相冲的变量名,在前面加!即可或者加上p或pp都行。

下面说下ipdb的两大功能:

  • 查看:查看函数的局部变量。
  • 修改:修改程序中的变量,并影响后面程序的运行结果。

常用的调试命令:

  • n:单步执行。
  • s:step,如果当前行为函数,进入函数内部。
  • u:up,返回上一层,即跳出函数外部,回到还未执行s这一步(还没有进入函数内部)
  • d:down,跳回之前调用到的下一层的位置(跟up成对使用,up跳出函数内部,down恢复到函数内部已经运行过的位置)
  • r:return,继续运行直到函数返回。
  • 查看变量名:当需要查看某个变量的时候,直接输入变量名,如果跟调试命令重复,使用!+变量名或者p(pp)+变量名
  • c:continue,继续运行,直到遇到下一个断点。
  • q:quit,退出调试。
  • j 跳过中间某些代码的执行。

ipdb使用的小技巧:

  • tab键:自动补齐。

此外,可以在pytorch中查看神经网络的各个层的输出,以及分析各个参数的梯度,动态修改pytorch的训练流程(不建议动态修改模型网络结构)。

程序运行一段时间后,可以通过touch/tmp/debug创建debug标识文件,当程序检测到这个文件的存在时,就会自动进入debug模式,退出则可以直接使用quit即可,程序结束后可以删除该文件。(未使用,不清楚)

7. 参考链接

PyTorch 19.Python调试器pdb
pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明
pytorch中ipdb的调试功能

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

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

相关文章

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 示例…

【openGauss】在openEuler(ARM架构)上安装openGauss(单机版)

一、系统版本介绍 当前案例中的openGauss安装,底层操作系统为openEuler-20.03-LTS版本,当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本,该实验使用的openEuler版本自带Python 3.7.4,不需要再自行安装 二…

光电探测器怎么选

想要挑选光电探测器,首先应该理解探测器的重要的几个指标。 实际看一个光电探测器吧 输入输出接口三个部分,光纤输入,射频输出,电源供电 数据手册 捡几个难理解的说说,详细推导解释这里不赘述了,难理解的…

【二】Netty 搭建简单的http服务

Netty 搭建简单的http服务Netty 简介代码展示netty 依赖NettyServer netty 服务端启动类MyChannelInitializer 设置编码解码器,并添加自己的业务方法MyClientHandler 实现自己的业务方法。主要方法 是读取到数据后处理效果展示服务端打印截图采用Postman 测试 截图N…

JDBC 实现增删改查的实际操作,很简单

大家好&#xff0c;今天给大家分享一下JDBC 实现增删改查的实际操作 我们还是使用的Maven的方式&#xff0c; 首先要创建一个干净的Maven webapps项目 看这个就可以了 要导入相关的依赖 <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connec…

如何使用 HTML5 Web 连接到 VMware vSphere Hypervisor

本文将向你展示如何在计算机上连接 VMware vSphere Hypervisor 7.0.3,VMware vSphere Hypervisor 7.0.3 也称为 ESXi 7.0.3。 连接 ESXi 7.0.3 下载工具以管理 ESXi 主机服务器连接 ESXi 7.0.3 服务器下载工具以管理 ESXi 主机服务器 现在不需要任何工具来管理 ESXi 7.0.3,从…

1.8周报

SourceURL:file:///home/mrl/文档/1.8周报.docx 周报 代码行数&#xff1a; 周一 611 周二 672 周三 524 周四 528 周五 450 周六 545 周日 564 遇到的问题&#xff1a; 系统配置问题&#xff1a; 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导…

数据脱敏实战经验

1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt3. 创建自定义序列化器&#xff1a;PrivacySerializer4. 隐私数据隐藏工具类&#xff1a;PrivacyUtil5. 注解使用这两天在整改等保测出的问题&#xff0c;里面有一个“用户…

如何将.md文件转换为pdf

目录 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&#xff09; 2.step2&#xff1a; 安装定制化插件 3.step3&#xff1a; 进入预览窗口模式 4.step4&#xff1a; 进行格式转换 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&a…

【实战篇】39 # 如何实现世界地图的新冠肺炎疫情可视化?

说明 【跟月影学可视化】学习笔记。 世界地图新冠肺炎疫情可视化 下面将实现世界地图新冠肺炎疫情可视化。数据用的是从 2020 年 1 月 22 日到 3 月 19 日这些天的新冠肺炎疫情进展。效果类似下图&#xff1a;https://covid19.who.int/ 步骤一&#xff1a;准备世界地图可视化…

[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

0 最短路径问题 战争时期&#xff0c;胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从 G 点出发&#xff0c;需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#…

不透明度和填充的区别

提纲 1、不透明度和填充的相同之处 2、不透明度和填充的不同之处 3、从字面意思理解不透明度和填充 1、不透明度和填充的相同之处 在初学PS时&#xff0c;一定对“不透明度”和“填充”非常迷惑&#xff0c;它们在图层面板的这个位置 这篇就来详细聊聊这两个滑块&#xff0…

SSR是什么?Vue中怎么实现?

一、是什么 Server-Side Rendering 称其为SSR&#xff0c;意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术&#xff0c;发送到浏览器&#xff0c;然后为其绑定状态与事件&#xff0c;成为完全可交互页面的过程 先来看看Web3个阶段的发展史&#xff1a; 传…

Dart基础

一、dart概述 Dart简介 Dart 是谷歌开发的&#xff0c;类型安全的&#xff0c;面向对象的编程语言&#xff0c;被应用于Web、服务器、移动应用和物联网等领域。Dart 诞生于 2011 年 10 月 10 日Dart简单易学(类似TypeScript, 是强类型的语言)运行方式 原生虚拟机(Dart 代码可…

从执行者到管理者的角色转变

前言 在职场中因为岗位职责的差异&#xff0c;我们通过被分为两种角色&#xff0c;即执行者和管理者&#xff1b;大部分管理者也是从执行者晋升来的。 因为思维的惯性&#xff0c;导致我们会很容易带着执行者的意识去做管理&#xff0c;遇到问题就会想着自己动手去做&#xff0…

智慧防雷+智能防雷的综合应用方案

随着物联网时代的到来&#xff0c;信息共享成为社会运转的动力&#xff0c;伴随着现代建筑、交通、医疗以及工业制造等行业的智能化&#xff0c;大量微电子网络、自动化设备、计算机等投入使用&#xff0c;其集成度高、工作电压小、工作电流低、绝缘强度低、耐过电压和过电流能…

HDMI接口电路设计

HDMI是一个能传输高清视频和多声道音频的接口&#xff0c;常用的有TYPE A&#xff0c;TYPEC&#xff0c;和TYPE D的HDMI&#xff0c;最常用的是这种TYPE A的HDMI接口&#xff0c;这个是母座HDMI TYPE A插座的引脚信号定义大家可以看下&#xff0c;总共包含19个引脚。其中TMDS d…

Hudi的核心概念 —— 索引(Index)

文章目录原理索引选项全局索引与非全局索引索引的选择策略原理 Hudi 通过索引机制提供高效的 upserts&#xff0c;具体是将给定的 hoodie key(record key&#xff08;记录键&#xff09; partition path)与文件 id&#xff08;文件组&#xff09;建立唯一映射。这种映射关系&…

Axure原型模板大全(100多款超高清高保真原型),APP+WEB精美版,绝对大神出品

LIB012 - Axure交互设计常用素材组件包(界面模型、流程图素材)LIB001 - Axure交互原型Web元件库完整版LIB001v2 - Axure WEB前后端交互原型通用元件库 v2LIB003 - Axure交互原型移动端元件库完整版LIB005 - Axure手机移动端交互原型通用元件库 v2LIB006 - Axure IPAD移动端交互…

Java工作流详解(附6大工作流框架对比)

目录1.什么是工作流2.工作流应用场景3.工作流实现方式4.有哪些工作流框架什么是工作流工作流(Worklow)工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流建模&#xff0c;即将工作流程中的工作如前后组织在一起的逻辑和规则&#xff0c;在计算机中以恰当的…