pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明
初学时大多使用print或log调试程序,这在小规模的程序下很方便
但是更好的方法是一边运行一边检查里面的变量和方法
1.Pdb
Pdb是一个交互式的调试工具,集成于Python标准库中
Pdb能让你根据需求跳转到任意的Python代码断点、查看任意变量、单步执行代码,甚至还能修改变量的值,而不必重启程序
⚠️pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。
而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具,如PyCharm IDE。
手册:https://docs.python.org/3.5/library/pdb.html#pdbcommand-where
pdb的使用方式和ipdb是一样的
2.ipdb
ipdb是增强版的pdb,参考https://github.com/gotcha/ipdb
1)安装:
(deeplearning) userdeMacBook-Pro:dogcat- user$ pip install ipdb
Requirement already satisfied: ipdb in /anaconda3/envs/deeplearning/lib/python3./site-packages (0.12)
...
ipdb提供了调试模式下的代码自动补全,还具有更好的语法高亮和代码溯源,以及更好的内省功能。它与pdb接口完全兼容
2)结合PyTorch和ipdb进行调试
1》集成到源代码中
要使用ipdb,只需要在想要进行调试的地方插入语句:
import ipdb
ipdb.set_trace() #相当于添加断点
当代码运行到这里,就会自动进入交互式调试模式
上面的方式虽然简单,但是存在着两个较为比较明显的问题:
- 插入的断点代码会污染原来的代码空间
- 每次插入断点都需要修改源码
try:
import ipdb
except:
import pdb as ipdb def sum(x):
r =
for ii in x:
r += ii
return r def mul(x):
r =
for ii in x:
r *= ii
return r ipdb.set_trace()
x = [,,,,]
r = sum(x)
r = mul(x)
当程序运行到ipdb.set_trace()语句时,会自动进入debug模式,在该模式中,我们可使用调试命令,如next或缩写n实现单步执行;也可以查看Python变量,或是运行Python代码
如果Python变量名和调试命令冲突,需在变量名前加!,这样ipdb会执行对应的Python命令,而不是调试命令
下面举例说明ipdb的调试
这里重点讲解ipdb的两大功能:
- 查看:在函数调用堆栈中自由跳动,并查看函数的局部变量
- 修改:修改程序中的变量,并能以此影响程序的运行结果
将上面的命令生成ipdb_test.py文件,使用命令行进行调试
(deeplearning) userdeMacBook-Pro:pytorch-learning user$ python ipdb_test.py
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
ipdb.set_trace()
---> x = [,,,,]
r = sum(x)
--->光标所指处为运行到的代码
下面进行说明调试时能够使用的命令:
l 1,18 : list 1,18的缩写,查看第1行到18行的代码
ipdb> l ,
try:
import ipdb
except:
import pdb as ipdb def sum(x):
r =
for ii in x:
r += ii
return r def mul(x):
r =
for ii in x:
r *= ii
return r ipdb.set_trace()
n : next的缩写,执行下一步;如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的
ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
x = [,,,,]
---> r = sum(x)
r = mul(x)
s : step的缩写,进入函数sum内部
ipdb> s
--Call--
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum() ----> def sum(x):
r =
再继续单步执行,再在函数中继续执行,耶可以不用输入n,直接回车则会使用上次的命令
ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
def sum(x):
----> r =
for ii in x: ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
r =
----> for ii in x:
r += ii ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
for ii in x:
----> r += ii
return r
u : up的缩写,跳回上一层的调用
ipdb> u
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
x = [,,,,]
---> r = sum(x)
r = mul(x)
d : down的缩写,跳回之前调用到的下一层的位置
ipdb> d
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
for ii in x:
----> r += ii
return r
当查看变量的命令和调试命令起冲突时,在前面加一个!
查看r变量,该变量名与调试命令r(eturn) 起冲突
ipdb> !r
return : 继续运行,直到函数返回,结束该sum()函数的运算
ipdb> return
--Return-- > /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
r += ii
---> return r
当命令和调试命令没有冲突的时候,可以直接运行,不用添加!
这里查看变量x的值,并对变量值进行修改
ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
x = [,,,,]
r = sum(x)
---> r = mul(x) ipdb> x
[, , , , ]
ipdb> x[0] = 10000
b 13 : break的缩写,在13行处添加一个断点,如果没有添加位置则输出所有的断点信息
ipdb> b
Breakpoint at /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py:
c : continue的缩写,继续运行,直到遇到断点
ipdb> c
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()mul()
def mul(x):
--> r =
for ii in x: ipdb> return
--Return-- > /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()mul()
r *= ii
---> return r
return后得到的是修改后的x的乘积
l(ist) 或 ll : ll 是查看整个源码文件,l 可指定需要查看的行数,默认是当前往后 11 行,也可指定具体的范围
ipdb> list
def mul(x):
r =
for ii in x:
r *= ii
---> return r
ipdb.set_trace()
x = [,,,,]
r = sum(x)
r = mul(x)
pp 或 p expression: 打印变量的值,两者的不同是p用的是print(),pp用的是pprint()
ipdb> pp x
[, , , , ]
ipdb> x
[, , , , ]
exit 或 q(uit) : 中止并退出
ipdb> q
Exiting Debugger.
关于ipdb的使用还又一些技巧:
- <tab>键能够自动补齐,补齐用法与IPython中的类似
- 可以直接在ipdb中修改变量的值
- h(elp)能够查看调试命令的用法,比如h h可以查看h(elp)命令的用法,h jump能够查看j(ump)命令的用法
其他命令:
run 或 restart [args ...]:两者就是别名的关系,重新运行该python调试项目,如果提供了参数,会使用shlex进行分离,并将结果作为新的sys.argv。历史记录、断点、行动和调试选项都会保留。
run [args ...]:这里的参数会作为运行脚本的参数
(deeplearning) userdeMBP:pytorch-learning user$ python -m ipdb ipdb_test.py
/anaconda3/envs/deeplearning/lib/python3./runpy.py:: RuntimeWarning: 'ipdb.__main__' found in sys.modules after import of package 'ipdb', but prior to execution of 'ipdb.__main__'; this may result in unpredictable behaviour
warn(RuntimeWarning(msg))
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
----> def sum(x):
r =
for ii in x: ipdb> run --x [,,,]
Restarting ipdb_test.py with arguments:
--x [,,,]
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
----> def sum(x):
r =
for ii in x: ipdb> import sys
ipdb> sys.argv
['ipdb_test.py', '--x', '[3,3,3,3]']
看到上面的结果,等价于 python ipdb_test.py --x [3,3,3,3],这个参数会作为运行sum(x)的参数
如果要得到的是全新的调试器,使用exit 或 q(uit)
通过b设置的断点在重新运行 debug 程序 (命令 restart 或 run) 后会依然保留,如果要忽略这些断点,有两种做法:
- cl(ear) :如果后面带有参数,就是清除指定的断点;如果不带参数就是清除所有的断点
(deeplearning) userdeMacBook-Pro:pytorch-learning user$ python ipdb_test.py
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
ipdb.set_trace()
---> x = [,,,,]
r = sum(x) ipdb> b
Breakpoint at /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py:
ipdb> cl
Deleted breakpoint at /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py:
ipdb> c
(deeplearning) userdeMacBook-Pro:pytorch-learning user$
因为设置的断点被清除了,所以运行c会直接结束
- disable/enable :禁用/激活断点
(deeplearning) userdeMacBook-Pro:pytorch-learning user$ python ipdb_test.py
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
ipdb.set_trace()
---> x = [,,,,]
r = sum(x) ipdb> b
Breakpoint at /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py:
ipdb> b
Breakpoint at /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py:
ipdb> disable
Disabled breakpoint at /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py:
ipdb> c
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
for ii in x:
---> r += ii
return r ipdb>
因为禁用了8处的断点,所以运行c直接就到了9的断点处
j(ump) :让程序跳转到指定的行数 ,能够跳过中间某些行代码的执行
注意:但是必须跳转的地方在当前的代码块中
ipdb> j
*** Jump failed: line comes after the current code block
ipdb> j
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
r += ii
---> return r ipdb>
w(here) : 显示最近的一些栈帧信息
ipdb> w
/Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
x = [,,,,]
---> r = sum(x)
r = mul(x) > /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
r += ii
---> return r
a(rgs) : 返回目前函数的参数列表
ipdb> a
x = [, , , , ]
这个sum()函数现在的参数就只有一个x
2》通过命令行进行交互
这种方法与上面方法不同在于不需要在代码中插入断点语句,而是在运行时添加-m参数运行,然后再进行调试
生成ipdb_test_command.py:
#import ipdb
def sum(x):
r =
for ii in x:
r += ii
return r def mul(x):
r =
for ii in x:
r *= ii
return r #ipdb.set_trace()
x = [,,,,]
r = sum(x)
r = mul(x)
运行:
(deeplearning) userdeMacBook-Pro:pytorch-learning user$ python -m ipdb ipdb_test_command.py
/anaconda3/envs/deeplearning/lib/python3./runpy.py:: RuntimeWarning: 'ipdb.__main__' found in sys.modules after import of package 'ipdb', but prior to execution of 'ipdb.__main__'; this may result in unpredictable behaviour
warn(RuntimeWarning(msg))
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
#import ipdb
----> def sum(x):
r = ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>() ----> def mul(x):
r = ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
#ipdb.set_trace()
---> x = [,,,,]
r = sum(x) ipdb> n
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()<module>()
x = [,,,,]
---> r = sum(x)
r = mul(x) ipdb> s
--Call--
> /Users/user/pytorch/jupyter/pytorch-learning/ipdb_test.py()sum()
#import ipdb
----> def sum(x):
r = ipdb>
-m参数,这样调用ipdb_test_command.py的话断点就是程序的执行第一行之前
然后就可以和上面一样使用命令进行调试
3.支持的函数
参考https://docs.python.org/3.5/library/pdb.html#pdbcommand-where
该模块定义了以下功能;每个进入调试器的方式略有不同:
pdb.set_trace()
从正在运行的程序中插入调试器的典型用法是插入
import pdb; pdb.set_trace()
在要进入调试器的位置插入上面的函数。然后,你可以按照此语句逐步执行代码,并使用continue命令在没有调试器的情况下继续运行。
大多数情况都只使用set_trace()函数和上面命令进行配合调试,下面的函数使用得比较少,没能查找到过多下面函数使用的情况,如果有小伙伴有这方面的资料,希望可以告知,谢谢
pdb.run(statement, globals=None, locals=None)-
在调试器控制下执行语句(以字符串或代码对象的形式给出)。调试器提示符出现在执行任何代码之前;您可以设置断点并键入continue来运行到断点,或者使用step或next逐步执行语句。可选的全局变量和局部变量指定执行代码的环境;默认情况下使用模块__main__的字典。(参见内置的exec()或eval()函数的说明。)
pdb.runeval(expression, globals=None, locals=None)-
计算调试器控制器下的表达式(以字符串或代码对象的形式给出)。当runeval()返回时,它返回表达式的值。否则,这个函数类似于run()。
pdb.runcall(function, *args, **kwds)-
使用给定的参数调用函数(函数或方法对象,而不是字符串)。当runcall()返回时,它返回函数调用返回的任何值。一旦输入函数,调试器提示符就会出现。
pdb.set_trace()-
在调用堆栈帧中输入调试器。这对于在程序中在给定点硬编码断点非常有用,即使代码没有被调试(例如,当断言失败时)。
pdb.post_mortem(traceback=None)-
输入给定traceback对象的事后调试。如果没有给出traceback,则使用当前正在处理的异常之一(如果要使用缺省值,则必须处理异常)。
pdb.pm()-
输入在sys.last_traceback中找到的traceback的事后调试。
run*函数和set_trace()是实例化Pdb类和调用同名方法的别名。如果你想获得更多的功能,你必须自己做:
- class
pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False) -
Pdb是调试器类。
completekey、stdin和stdout参数被传递给底层
cmd.Cmd类;如果给定了skip参数,则它必须是可迭代的全局样式模块名称模式。调试器不会进入起源于与这些模式之一匹配的模块中的框架。
默认情况下,当您发出continue命令时,Pdb为SIGINT信号设置一个处理程序(当用户在控制台上按Ctrl-C时发送该信号)。这允许您通过按Ctrl-C再次进入调试器。如果希望Pdb不接触SIGINT处理程序,请将nosigint设置为true。
启用跟踪与skip的例子调用:
import pdb; pdb.Pdb(skip=['django.*']).set_trace()
新版本3.1:skip参数。
新版本3.2:nosigint参数。以前,Pdb从未设置过SIGINT处理程序。
pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明的更多相关文章
- pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用
参考深度学习框架pytorch:入门和实践一书第六章 以深度学习框架PyTorch一书的学习-第六章-实战指南为前提 在pytorch中Debug pytorch作为一个动态图框架,与ipdb结合能为 ...
- Django之Django debug toolbar调试工具
一.安装Django debug toolbar调试工具 pip3 install django-debug-toolbar 如果出错命令为 pip install django_debug_tool ...
- Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试
pdb / ipdb 模块 / pdb / ipdb Module pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. 下面是一个简单的使用示例 i ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- 最新GHOST XP系统下载旗舰增强版 V2016年
系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...
- 最新深度技术GHOST XP系统旗舰增强版 V2016年
来自系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插件,增强浏 ...
- WinNTSetup v3.8.7 正式版绿色增强版
最强系统安装利器:WinNTSetup 现已更新至 v3.8.7 正式版!这次更新修复调整了诸多问题,新版非常好用接近完美!WinNTSetup 现在已经自带BCDBoot 选项,并且完全支持Wind ...
- 将表里的数据批量生成INSERT语句的存储过程 继续增强版
文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...
随机推荐
- 构造方法为private与类修饰符为final
构造方法为private的:在这个类外1:不能继承这个类2:不能用new来产生这个类的实例 在这个类内:1:可以继承这个类2:可以用new来产生这个类的实例 类修饰符为final的:在这个类外1:不能 ...
- jQuery中$.ajax()方法参数解析
本文实例为大家讲解了jQuery $.ajax()方法参数,供大家参考,具体内容如下 $.ajax({ url:'test.do', data:{id:123,name:'xiaoming'}, ty ...
- js求渐升数的第100位
我弟考了道数学竞赛题,问我能不能用代码算结果.. 题目是这样的 用 1.2.3.4.5 组合数字,然后排列大小,从小到大,求排在第100位的数值大小 function foo(chars) { ; i ...
- centos7学习笔记-安装配置apache
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装apache #yum install httpd 2.配置开机启动 systemctl enable httpd 3. ...
- Html5新增标签的学习。
随笔,记录的比较随便. 今天新学习了9个标签. <audio> 简单的说就是一个音频标签,他的主要常用属性有src=""音频的路径 controls="con ...
- [IB]Integration Broker 是如何处理传入的请求(Part 2)
让我们讨论一下集成代理如何处理传入的请求.可以先阅读(理解PeopleSoft集成代理 Part1). 当PeopleSoft集成代理接收传入请求时,会发生一系列事件. 当侦听连接器(Listenin ...
- IOS UIWebView用法
转自猫猫小屋 IOS webview控件使用简介(一) IOS webview控件使用简介(二)–加载本地html
- c/c++ 数组的智能指针 使用
数组的智能指针 使用 数组的智能指针的限制: 1,unique_ptr的数组智能指针,没有*和->操作,但支持下标操作[] 2,shared_ptr的数组智能指针,有*和->操作,但不支持 ...
- 为爱好舞蹈的人们做的软件,细究数据结构,操作系统,磁盘原理,用java/c/c++写一个开源 MP3助手
1.可以给歌曲间插播空白音乐 2.拖拽式调整 3.先排序,后一键写入顺序文件. 国外的开源软件 MP3 播放排序 http://www.murraymoffatt.com/software-prob ...
- 管理ESXI网络
一.实验拓扑图: 二.实验目标:部署标准交换机和分布式交换机 三.实验步骤: 标准交换机的配置 1.分别在两台esxi主机中添加6块物理网卡,桥接到vmnet1. 通过宿主机连接到sql-vcente ...