python调试工具pdb的用法汇总(Python Debugger)
本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于pdb调试工具的相关内容,包括了pdb基本命令、用break设置断点等等内容, 下面一起来看一下,希望对大家有帮助。
【相关推荐: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文件,放下同一路径下:

看一下每个文件的内容:
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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

Debian系统中的readdir函数是用于读取目录内容的系统调用,常用于C语言编程。本文将介绍如何将readdir与其他工具集成,以增强其功能。方法一:C语言程序与管道结合首先,编写一个C程序调用readdir函数并输出结果:#include#include#includeintmain(intargc,char*argv[]){DIR*dir;structdirent*entry;if(argc!=2){

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

本文将指导您如何在Debian系统上更新NginxSSL证书。第一步:安装Certbot首先,请确保您的系统已安装certbot和python3-certbot-nginx包。若未安装,请执行以下命令:sudoapt-getupdatesudoapt-getinstallcertbotpython3-certbot-nginx第二步:获取并配置证书使用certbot命令获取Let'sEncrypt证书并配置Nginx:sudocertbot--nginx按照提示选

在Debian系统上配置HTTPS服务器涉及几个步骤,包括安装必要的软件、生成SSL证书、配置Web服务器(如Apache或Nginx)以使用SSL证书。以下是一个基本的指南,假设你使用的是ApacheWeb服务器。1.安装必要的软件首先,确保你的系统是最新的,并安装Apache和OpenSSL:sudoaptupdatesudoaptupgradesudoaptinsta

在Debian上开发GitLab插件需要一些特定的步骤和知识。以下是一个基本的指南,帮助你开始这个过程。安装GitLab首先,你需要在Debian系统上安装GitLab。可以参考GitLab的官方安装手册。获取API访问令牌在进行API集成之前,首先需要获取GitLab的API访问令牌。打开GitLab仪表盘,在用户设置中找到“AccessTokens”选项,生成一个新的访问令牌。将生成的

Apache是互联网幕后的英雄,不仅是Web服务器,更是一个支持巨大流量、提供动态内容的强大平台。它通过模块化设计提供极高的灵活性,可根据需要扩展各种功能。然而,模块化也带来配置和性能方面的挑战,需要谨慎管理。Apache适合需要高度可定制、满足复杂需求的服务器场景。
