Python 调试器:单步执行交互式调用的函数
Python 相当酷,但不幸的是,它的调试器不如 perl -d。
在尝试代码时,我经常做的一件事是从调试器中调用一个函数,然后单步执行该函数,如下所示:
# NOTE THAT THIS PROGRAM EXITS IMMEDIATELY WITHOUT CALLING FOO()
~> cat -n /tmp/show_perl.pl
1 #!/usr/local/bin/perl
2
3 sub foo {
4 print "hi\n";
5 print "bye\n";
6 }
7
8 exit 0;
~> perl -d /tmp/show_perl.pl
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(/tmp/show_perl.pl:8): exit 0;
# MAGIC HAPPENS HERE -- I AM STEPPING INTO A FUNCTION THAT I AM CALLING INTERACTIVELY
DB<1> s foo()
main::((eval 6)[/usr/local/lib/perl5/5.8.6/perl5db.pl:628]:3):
3: foo();
DB<<2>> s
main::foo(/tmp/show_perl.pl:4): print "hi\n";
DB<<2>> n
hi
main::foo(/tmp/show_perl.pl:5): print "bye\n";
DB<<2>> n
bye
DB<2> n
Debugged program terminated. Use q to quit or R to restart,
use O inhibit_exit to avoid stopping after program termination,
h q, h R or h O to get additional info.
DB<2> q
当尝试单步执行函数对各种不同输入的处理以找出原因时,这非常有用它失败。 然而,它似乎在 pdb 或 pydb 中都不起作用(我将展示一个与上面的示例等效的 python 示例,但它会导致大量异常堆栈转储)。
所以我的问题是双重的:
- 我错过了什么吗?
- 有没有一个 python 调试器确实可以让我做到这一点?
显然,我可以自己将调用放入代码中,但我喜欢交互式工作,例如。 当我想尝试使用稍微不同的参数集进行调用时,不必从头开始。
Python is quite cool, but unfortunately, its debugger is not as good as perl -d.
One thing that I do very commonly when experimenting with code is to call a function from within the debugger, and step into that function, like so:
# NOTE THAT THIS PROGRAM EXITS IMMEDIATELY WITHOUT CALLING FOO()
~> cat -n /tmp/show_perl.pl
1 #!/usr/local/bin/perl
2
3 sub foo {
4 print "hi\n";
5 print "bye\n";
6 }
7
8 exit 0;
~> perl -d /tmp/show_perl.pl
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(/tmp/show_perl.pl:8): exit 0;
# MAGIC HAPPENS HERE -- I AM STEPPING INTO A FUNCTION THAT I AM CALLING INTERACTIVELY
DB<1> s foo()
main::((eval 6)[/usr/local/lib/perl5/5.8.6/perl5db.pl:628]:3):
3: foo();
DB<<2>> s
main::foo(/tmp/show_perl.pl:4): print "hi\n";
DB<<2>> n
hi
main::foo(/tmp/show_perl.pl:5): print "bye\n";
DB<<2>> n
bye
DB<2> n
Debugged program terminated. Use q to quit or R to restart,
use O inhibit_exit to avoid stopping after program termination,
h q, h R or h O to get additional info.
DB<2> q
This is incredibly useful when trying to step through a function's handling of various different inputs to figure out why it fails. However, it does not seem to work in either pdb or pydb (I'd show an equivalent python example to the one above but it results in a large exception stack dump).
So my question is twofold:
- Am I missing something?
- Is there a python debugger that would indeed let me do this?
Obviously I could put the calls in the code myself, but I love working interactively, eg. not having to start from scratch when I want to try calling with a slightly different set of arguments.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我已经回答了我自己的问题! 这是 pydb 中的“调试”命令:
And I've answered my own question! It's the "debug" command in pydb:
您也可以使用 pdb 交互式地调试函数,前提是您要调试的脚本最后没有 exit():
要调试,启动交互式 python 会话并导入 pdb:
pdb 模块随 python 一起提供,并记录在模块文档位于 http://docs.python.org/modindex.html
You can interactively debug a function with pdb as well, provided the script you want to debug does not exit() at the end:
To debug, start an interactive python session and import pdb:
The pdb module comes with python and is documented in the modules docs at http://docs.python.org/modindex.html
有一个 python 调试器,它是 python 核心发行版的一部分,称为“pdb”。 我自己很少使用它,但有时发现它很有用。
给定这个程序:
这是一个调试它的会话:
There is a python debugger that is part of the core distribution of python called 'pdb'. I rarely use it myself, but find it useful sometimes.
Given this program:
Here is a session debugging it:
对于我正在开发的代码的交互式工作,我通常发现使用
pdb.set_trace
在代码本身中设置编程“断点”会更有效。 这也使得在循环深处中断程序状态变得很容易:if: pdb.set_trace()
For interactive work on code I'm developing, I usually find it more efficient to set a programmatic "break point" in the code itself with
pdb.set_trace
. This makes it easir to break on the program's state deep in a a loop, too:if <state>: pdb.set_trace()
如果您更熟悉 GUI 调试器,可以使用 winpdb(本例中的“win”并非指 Windows)。 我实际上在 Linux 上使用它。
在 debian/ubuntu 上:
然后只需将其放入您希望其中断的代码中:
然后启动 winpdb 并附加到您正在运行的脚本。
If you're more familiar with a GUI debugger, there's winpdb ('win' in this case does not refer to Windows). I actually use it on Linux.
On debian/ubuntu:
Then just put this in your code where you want it to break:
Then start winpdb and attach to your running script.