Python 调试器 : Stepping into a function that you have called interactively

标签 python debugging pdb

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 示例,但它会导致大量异常堆栈转储)。

所以我的问题是双重的:

  1. 我错过了什么吗?
  2. 是否有一个 python 调试器确实可以让我这样做?

显然我可以自己将调用放入代码中,但我喜欢交互式工作,例如。当我想尝试使用稍微不同的一组参数进行调用时,不必从头开始。

最佳答案

我已经回答了我自己的问题!这是pydb中的“调试”命令:

~> cat -n /tmp/test_python.py
     1  #!/usr/local/bin/python
     2
     3  def foo():
     4      print "hi"
     5      print "bye"
     6
     7  exit(0)
     8

~> pydb /tmp/test_python.py
(/tmp/test_python.py:7):  <module>
7 exit(0)


(Pydb) debug foo()
ENTERING RECURSIVE DEBUGGER
------------------------Call level 11
(/tmp/test_python.py:3):  foo
3 def foo():

((Pydb)) s
(/tmp/test_python.py:4):  foo
4     print "hi"

((Pydb)) s
hi
(/tmp/test_python.py:5):  foo
5     print "bye"


((Pydb)) s
bye
------------------------Return from level 11 (<type 'NoneType'>)
----------------------Return from level 10 (<type 'NoneType'>)
LEAVING RECURSIVE DEBUGGER
(/tmp/test_python.py:7):  <module>

关于Python 调试器 : Stepping into a function that you have called interactively,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/228642/

相关文章:

django - 如何排除故障 - ImportError : Could not import settings 'mysite.settings' when deploying django?

c++ - 当指向基类的指针指向特定子类时有条件地中断的断点

python - 你如何调试无响应的 Django?

python - Python 中的时间旅行调试 - 建议使用哪些工具?

python - 使用列表生成器时 Python 3 中的 pdb 模块中可能存在错误

python - 带有圆形图像的 Qlabel

python - 解析两个大数据帧时出现内存错误

python - pdb:如何显示当前行,而不是在上一个列表之后继续?

Python:从数据框中删除字典中不存在值的行

python - 如何在 ReportLab 段落中插入回车符?