那里。
我有一些为Python 3.1编写的代码行为不端的代码。如果它是一些C代码,我首先使用gdbserver
,附加到进程(它涉及一个相当复杂的命令行,python进程在stdin上接收它的输入),触发我最喜欢的GDB前端 - 结束,我会准备好弄明白为什么会出错。
但它是蟒蛇。我刚刚尝试了pdb
模块,但是当它关闭时我无法中断该过程:我得到了一个“KeyboardInterrupt”(我需要更改命令链的其余部分,以便它们给出{{1一个去)
我尝试了winpdb,它产生了奇怪的错误消息
set_ptrace
并在我附加到流程之前询问了“密码”。它让我觉得winpdb只适用于python2。
我刚尝试 Unhandled Exception (in pyshared/rpdb2.py)
以便附加到正在运行的进程,但是可以想象“格式无法识别”。
我错过的联机帮助页在哪里?
PS:哦,这是一个多线程的过程,如果重要的话。
一个最小的例子:
gdb __main__.py
答案 0 :(得分:3)
使用pdb的典型方法是添加一行:
import pdb;pdb.set_trace()
你想要休息的地方。如果您希望中断是有条件的,那么您只需添加条件,如:
if x > 1000:
import pdb;pdb.set_trace()
不涉及CTRL-C。
但是,如果让pdb模块运行脚本,将安装CTRL-C挂钩:
python3 /path/to/stdlib/pdb.py myscript.py
更简单,更简单的写法:
python3 -m pdb myscript.py
某些Linux发行版也将链接到/ usr / bin中的pdb.py,这意味着您将其作为命令获取:
pdb3 myscript.py
上述所有这三个命令都做同样的事情。然而,这件事与pdb.set_trace()
不同,因为按下CTRL-C将进入事后验证调试。这意味着您无法单步执行代码,因为下一步将退出程序。因此,它比上述技术的用处少得多。然而,它可以快速找出代码中的内容花费大量时间,当它运行缓慢时,它将允许您在正确的位置放入set_trace()以找出为什么它很慢。
确实如上所述,似乎在Python 3.1中被打破了。但它确实可以在Python 3.2中使用。
它只能在简单的情况下工作,但在更复杂的情况下,你需要使用分析来找到罪魁祸首。
答案 1 :(得分:1)
我正在使用pdb
,这对我来说很好。按下Ctrl-C后,您可以对程序的状态进行事后调试,并且您可以访问回溯中的所有堆栈帧。如果要进行实时调试,请在Ctrl-C发生的位置设置断点,然后重新开始。
答案 2 :(得分:0)
set_trace()
。这似乎是python 3.1中唯一的工作方式
答案 3 :(得分:0)
组合按需中断和python-interpreter调试的方法可能是使用另一个信号,例如SIGUSR1,让它改变全局“调试”标志,并有条件地调用{{1当debugging == True时。