内容简介:授人以鱼不如授人以渔,掌握调试方法是学习提升的一个必备条件。前几天因为探索了一下 Python 模块引入路径的问题,看到「翔 Core」用 pdb 调试的很溜,因此,今天研究一下 ipdb好啦。ipdb 是 pdb 模块的升级版,会启动一个 ipython 的调试窗口。
授人以鱼不如授人以渔,掌握调试方法是学习提升的一个必备条件。前几天因为探索了一下 Python 模块引入路径的问题,看到「翔 Core」用 pdb 调试的很溜,因此,今天研究一下 ipdb好啦。
安装
ipdb 是 pdb 模块的升级版,会启动一个 ipython 的调试窗口。
pip install ipdb
使用
python -m ipdb demo.py import ipdb;ipdb.set_trace()
帮助文档
在 ipdb 窗口,输入 h ,会看到帮助文档, h <command>
可以查看具体命令的帮助。
Documented commands (type help <topic>): ======================================== EOF cl disable interact next psource rv unt a clear display j p q s until alias commands down jump pdef quit source up args condition enable l pdoc r step w b cont exit list pfile restart tbreak whatis break continue h ll pinfo return u where bt d help longlist pinfo2 retval unalias c debug ignore n pp run undisplay Miscellaneous help topics: ========================== exec pdb
常用命令
-
a(rgs)
:打印当前函数的参数列表 ★★★ -
b(reak) [ ([filename:]lineno | function) [, condition] ]
:设置断点,可以接行数或者行数名作为参数,比如,b 8
就是在第8行打断点,还可以给外部的文件加上断点b file_name:line_number
,如果只敲b
,会显示全部断点 -
c(ont(inue))
:继续执行,当遇到断点时才会停止 ★★★ -
cl(ear) filename:lineno
:可以清除断点,不过不加「断点号」,可以清除所有断点 -
disable bpnumber [bpnumber ...]
:禁用指定[断点号]的断点 -
enable bpnumber [bpnumber ...]
:启用指定[断点号]的断点 -
Enter
:重复上次命令 ★★★ -
j(ump)
:设置下一步执行的行,这个语句可以让你跳过某些语句的执行,并不是网上一些文章说的跳到某行
,跳到某行可不是代表会跳过某些语句的,文档最准确 -
ll
orl
:查看当前将要运行的代码段 -
n(ext)
:让程序运行下一行,如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的 ★★★ -
pp expression
orp expression
:前者以 pprint 方式打印表达式的值,后者 print 方式 ★★★ -
q(uit)
:退出调试,同时,你也可以使用Ctrl+D
退出调试 -
r(eturn)
:继续执行,直到当前函数返回 ★★★ -
restart "restart" is an alias for "run".
:是run
命令的别名,重新启动调试器; -
run [args...]
:这里的参数会作为运行脚本的参数,等价于python demo.py [args...]
,可以通过sys.argv
查看参数列表,重新运行时,断点等信息会保留的 -
s(tep)
:和 n 相似,但是如果当前有一个函数调用,s 会进入被调用的函数体中 ★★★ -
w(here)
:打印一个堆栈跟踪, -
!
:感叹号后面跟着语句,可以直接改变某个变量的值
示例
断点示例
下面是一个关于断点的示例:
执行 b 7
、 b 12
之后,输入 ll
查看,最左侧的 1、2
就是断点号,输入 c
,下次运行到断点处,执行就会停下来。
ipdb> ll ----> 1 a = 'michael' 2 print(a) 3 4 def hello(name): 5 print('hello') 6 for i in range(5): 1 7 print(i) 8 print(name) 9 10 11 hello('michael') 2 12 x = 10 13 y = 20
执行 disable 1
,下次执行到「断点1」处,就不会停下来了,输入 b
可以查看全部断点:
ipdb> b Num Type Disp Enb Where 1 breakpoint keep no at /Users/michael/Code/00-Temp/b.py:7 2 breakpoint keep yes at /Users/michael/Code/00-Temp/b.py:12
如果想清除「断点2」,那么执行 cl 2
即可:
ipdb> cl 2 Deleted breakpoint 2 at /Users/michael/Code/00-Temp/b.py:12
run 示例
ipdb> run --name michael Restarting b.py with arguments: --name michael > /Users/michael/Code/00-Temp/b.py(1)<module>() ----> 1 a = 'michael' 2 print(a) 3 ipdb> import sys ipdb> sys.argv ['b.py', '--name', 'michael']
看到上面的结果,确实等价于 python b.py --name michael
。
注意点
在 ipdb
调试窗口,虽然可以随时给变量赋值,但是要注意变量的名字和 ipdb 的命令不能重复了,否则会出错,可以用 !b=123
来规避这个问题。
最后
学完这个 ipdb 的调试,再回头看看 Pycharm 的 debug 功能,貌似都能理解了!
参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何使用VS Code调试Node.js C++ Addon 模块
- iOS常用调试方法:断点调试
- 断点调试和日志调试之间的平衡点:函数计算调试之 Python 篇
- .NET高级调试系列-Windbg调试入门篇
- VisualStudio 通过外部调试方法快速调试库代码
- GDB 调试 Mysql 实战(二)GDB 调试打印
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。