目录
一、pdb 有2种用法
二、pdb 基本命令
三、在指定文件的指定位置,用break命令设置断点
3.1 在本文件中的指定位置设置断点" >3.1 在本文件中的指定位置设置断点
3.2 在其他文件中的指定位置设置断点" >3.2 在其他文件中的指定位置设置断点
四、使用 pdb 时发现的问题
4.1 使用软链接时,pdb 显示的文件路径与实际路径不一致的问题" >4.1 使用软链接时,pdb 显示的文件路径与实际路径不一致的问题
4.2 pdb有时候无法在模型的 forward() 方法中加入断点" >4.2 pdb有时候无法在模型的 forward() 方法中加入断点
五、程序奔溃后的事后调试:pdb.pm()
首页 后端开发 Python教程 python调试工具pdb的用法汇总(Python Debugger)

python调试工具pdb的用法汇总(Python Debugger)

Nov 07, 2022 pm 04:46 PM
python

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于pdb调试工具的相关内容,包括了pdb基本命令、用break设置断点等等内容, 下面一起来看一下,希望对大家有帮助。

python调试工具pdb的用法汇总(Python Debugger)

【相关推荐:Python3视频教程

一、pdb 有2种用法

pdb:python debugger

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

python3 -m pdb filename.py

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

import pdb pdb.set_trace()

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

(Pdb)

二、pdb 基本命令

命令 解释
break 或 b 设置断点
continue 或 c 继续执行程序
list 或 l 查看当前行的代码段
step 或 s 进入函数(进入 for 循环用 next 而不是用 step)
return 或 r 执行代码直到从当前函数返回
next 或 n 执行下一行
up 或 u 返回到上个调用点(不是上一行)
p x 打印变量x的值
exit 或 q 中止调试,退出程序
help 帮助

在实际使用中发现,用shell脚本运行python文件时,可能无法用pdb调试,会退出。此时只能直接运行py文件来调试。

三、在指定文件的指定位置,用break命令设置断点

3.1 在本文件中的指定位置设置断点

比如下面的例子,要想进入到模型的 forward() 方法中查看前向传播过程中的数据处理过程,只能在  forward() 的第一行(即26行)设置断点,pdb.set_trace()

但有时候模型很复杂,用这种方法会导致程序报错直接退出(我也不知道是什么原因),那么我们就可以考虑用 break 命令在这一行插入断点,使得程序运行到 forward() 时就会停下来。

import torchimport torch.nn as nnimport pdbclass EncoderLayer(nn.Module):    def __init__(self):        super().__init__()
        self.conv1 = nn.Conv2d(4, 10, (3, 3))
        self.conv2 = nn.Conv2d(10, 4, (3, 3))
        self.relu = nn.ReLU()    def forward(self, x):
        x=self.relu(self.conv1(x))        return self.relu(self.conv2(x))class Encoder(nn.Module):    def __init__(self,num_layers):        super().__init__()        # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。
        self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)])    def forward(self, x):        # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。
        for layer in self.ModelList:
            x = layer(x)        return xif __name__=="__main__":
    pdb.set_trace()   
    input = torch.rand(5, 4, 30, 30)
    model = Encoder(num_layers=4)
    output = model(input)
登录后复制

具体方法: (1)首先在前面的任意一行设置 pdb.set_trace() ,使得程序停下来。 (2)输入 break 26 就可以了。如图:

在这里插入图片描述这样断点就设置成功了,程序运行到forward()就会停下来。

这里的26是行数,需要注意的是 断点位置不能是注释,比如我们在25行(注释行)设置断点,就会失败:

在这里插入图片描述总结一下,在同一个文件中设置断点的命令是:

break line

3.2 在其他文件中的指定位置设置断点

如果想要设置的断点不在初始运行文件里面呢,怎么在其他文件中用break命令设置断点呢?我们看这个例子:

把3.1的代码分为三个py文件,放下同一路径下:

  ![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b5d476ba5b14b0ba541d78930b9704a~tplv-k3u1fbpfcp-zoom-1.image)
登录后复制

看一下每个文件的内容:

run.py:

初始的 pdb.set_trace() 设置在run.py中。

import torchfrom encoder import Encoderimport pdbif __name__=="__main__":
    pdb.set_trace()    input = torch.rand(5, 4, 30, 30)
    model = Encoder(num_layers=4)
    output = model(input)
登录后复制

encoder.py:

from encoder_layer import EncoderLayerimport torch.nn as nnclass Encoder(nn.Module):    def __init__(self,num_layers):        super().__init__()        # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。
        self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)])    def forward(self, x):        # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。
        for layer in self.ModelList:
            x = layer(x)        return x
登录后复制

encoder_layer.py:

import torch.nn as nnclass EncoderLayer(nn.Module):    def __init__(self):        super().__init__()
        self.conv1 = nn.Conv2d(4, 10, (3, 3))
        self.conv2 = nn.Conv2d(10, 4, (3, 3))
        self.relu = nn.ReLU()    def forward(self, x):
        x=self.relu(self.conv1(x))        return self.relu(self.conv2(x))
登录后复制

现在我们运行 run.py ,然后在 encoder.py 的第12行 设置断点,即

for layer in self.ModelList:

命令为:

break encoder.py:12

即 break filename:line在这里插入图片描述我们可以看到,程序可以从  output = model(input) 进入到 forward() 中:在这里插入图片描述这样可以很方便地进行调试。

如果初始断点与目标断点不在同一个目录下的文件中,也可以通过相对路径下的文件名设置断点,如:

(Pdb) break ../transformer/asr_model.py:91Breakpoint 1 at /local/wenet/examples/aishell/s0/wenet/transformer/asr_model.py:91(Pdb)
登录后复制

四、使用 pdb 时发现的问题

4.1 使用软链接时,pdb 显示的文件路径与实际路径不一致的问题

如图可以发现,pdb 有三行组成,第一行时文件路径,第二行是当前执行的代码行,第三行是输入命令行。

在存在软链接时,pdb显示的路径是软链接指向的路径,但实际上的代码路径是拷贝了软连接内容的路径,这两个路径不一样,一定要注意。在这里插入图片描述

4.2 pdb有时候无法在模型的 forward() 方法中加入断点

pdb有时候无法用 pdb.set_trace() 在模型的 forward() 方法中加入断点,报错内容为:

Compiled functions can't take variable number of arguments or use keyword-only arguments with defaul

大概意思是 “编译后的函数不能接受数量可变的参数,也不能在default中使用仅关键字参数。”

不懂啥意思,这个问题也没有解决。

五、程序奔溃后的事后调试:pdb.pm()

前面所述都是在程序开始运行时就插入断点,用pdb进行调试,即事前调试。其实 pdb 还可以进行事后调试,即在程序有bug运行奔溃后用python调试器进行查看。

比如 test.py 显然是有 bug 的:

# test.pydef add(n):    return n+1add("hello")
登录后复制

直接运行:

python test.py

程序奔溃:

F:\PycharmProjects\pytorch_practice>python test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    add("hello")
  File "test.py", line 2, in add
    return n+1
TypeError: can only concatenate str (not "int") to str
登录后复制

这样我们是无法用pdb进行调试的。那么当程序崩溃后,我们该怎样去调试呢?

我们可以用下面这个命令进行简单调试:

python -i test.py

-i 选项可以让程序结束后打开一个交互式shell,如下:

F:\PycharmProjects\pytorch_practice>python -i test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    add("hello")
  File "test.py", line 2, in add
    return n+1
TypeError: can only concatenate str (not "int") to str
>>>
登录后复制

现在我们发现程序结束后出现了 >>> 符号,这就是python调试器。

输入命令:

import pdb pdb.pm()

其中 pdb.pm() 用于程序发生异常导致奔溃后的事后调试,可以跟踪异常程序最后的堆在信息。

执行命令后得到:

TypeError: can only concatenate str (not "int") to str
>>> import pdb
>>> pdb.pm()
> f:\pycharmprojects\pytorch_practice\test.py(2)add()
-> return n+1
(Pdb)
登录后复制

可以发现,pdb.pm() 已经追踪到了导致程序奔溃的语句:return n+1

此时可以打印 n 的值进行检查:

(Pdb) p n'hello'(Pdb) q>>> quit()

F:\PycharmProjects\pytorch_practice>
登录后复制

q 表示退出pdb调试,quit() 表示退出 python 调试器。

【相关推荐:Python3视频教程

以上是python调试工具pdb的用法汇总(Python Debugger)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

有没有手机APP可以将XML转换成PDF? 有没有手机APP可以将XML转换成PDF? Apr 02, 2025 pm 09:45 PM

没有APP可以将所有XML文件转成PDF,因为XML结构灵活多样。XML转PDF的核心是将数据结构转换为页面布局,需要解析XML并生成PDF。常用的方法包括使用Python库(如ElementTree)解析XML,并利用ReportLab库生成PDF。对于复杂XML,可能需要使用XSLT转换结构。性能优化时,考虑使用多线程或多进程,并选择合适的库。

有什么手机APP可以将XML转换成PDF? 有什么手机APP可以将XML转换成PDF? Apr 02, 2025 pm 08:54 PM

无法找到一款将 XML 直接转换为 PDF 的应用程序,因为它们是两种根本不同的格式。XML 用于存储数据,而 PDF 用于显示文档。要完成转换,可以使用编程语言和库,例如 Python 和 ReportLab,来解析 XML 数据并生成 PDF 文档。

xml格式怎么打开 xml格式怎么打开 Apr 02, 2025 pm 09:00 PM

用大多数文本编辑器即可打开XML文件;若需更直观的树状展示,可使用 XML 编辑器,如 Oxygen XML Editor 或 XMLSpy;在程序中处理 XML 数据则需使用编程语言(如 Python)与 XML 库(如 xml.etree.ElementTree)来解析。

xml格式如何美化 xml格式如何美化 Apr 02, 2025 pm 09:57 PM

XML 美化本质上是提高其可读性,包括合理的缩进、换行和标签组织。其原理是通过遍历 XML 树,根据层级增加缩进,并处理空标签和包含文本的标签。Python 的 xml.etree.ElementTree 库提供了方便的 pretty_xml() 函数,可以实现上述美化过程。

手机XML转PDF,转换速度快吗? 手机XML转PDF,转换速度快吗? Apr 02, 2025 pm 10:09 PM

手机XML转PDF的速度取决于以下因素:XML结构的复杂性手机硬件配置转换方法(库、算法)代码质量优化手段(选择高效库、优化算法、缓存数据、利用多线程)总体而言,没有绝对的答案,需要根据具体情况进行优化。

怎么在手机上把XML文件转换为PDF? 怎么在手机上把XML文件转换为PDF? Apr 02, 2025 pm 10:12 PM

不可能直接在手机上用单一应用完成 XML 到 PDF 的转换。需要使用云端服务,通过两步走的方式实现:1. 在云端转换 XML 为 PDF,2. 在手机端访问或下载转换后的 PDF 文件。

xml怎么转换成图片 xml怎么转换成图片 Apr 03, 2025 am 07:39 AM

可以将 XML 转换为图像,方法是使用 XSLT 转换器或图像库。XSLT 转换器:使用 XSLT 处理器和样式表,将 XML 转换为图像。图像库:使用 PIL 或 ImageMagick 等库,从 XML 数据创建图像,例如绘制形状和文本。

XML转换成图片的大小如何控制? XML转换成图片的大小如何控制? Apr 02, 2025 pm 07:24 PM

想要通过XML生成图片,需要使用图形库(如Pillow、JFreeChart)作为桥梁,根据XML中的元数据(尺寸、颜色)生成图片。控制图片大小的关键在于调整XML中&lt;width&gt;和&lt;height&gt;标签的值。然而,在实际应用中,XML结构的复杂性、图形绘制的精细度、图片生成的速度和内存消耗,以及图片格式的选择,都对生成的图片大小产生影响,因此需要深入理解XML结构、熟练掌握图形库,以及考虑优化算法和图片格式选择等因素。

See all articles