0

0

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

WBOY

WBOY

发布时间:2022-11-07 16:46:03

|

7241人浏览过

|

来源于掘金

转载

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

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

【相关推荐:Python3视频教程

一、pdb 有2种用法

pdb:python debugger

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

立即学习Python免费学习笔记(深入)”;

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

星火作家大神
星火作家大神

星火作家大神是一款面向作家的AI写作工具

下载

即 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 
    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 
    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速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

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

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

29

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

157

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

120

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

23

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

169

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 6.8万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号