python调试工具pdb的用法汇总(Python Debugger)
本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于pdb调试工具的相关内容,包括了pdb基本命令、用break设置断点等等内容, 下面一起来看一下,希望对大家有帮助。
程序员必备接口测试调试工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api设计、调试、文档、自动化测试工具
后端、前端、测试,同时在线协作,内容实时同步
【相关推荐: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)
登录后复制