如果我想运行一个脚本并让pdb
捕获任何异常,我就这样调用它:
python -m pdb script.py
或者:
pdb script.py
问题是它立即停在调试提示符处:
> /home/coiax/Junkyard/script.py(1)<module>()
-> import sys
(Pdb)
我必须输入c
或continue
才能使用它。有没有办法让它只是加载并启动脚本而不是最初询问我是否要设置任何断点或其他什么?
我发誓我已阅读pdb
模块文档,并尝试制作包含
c
但它并没有自动启动。
答案 0 :(得分:9)
使用ipython
:
ipython yourmodule.py --pdb
每当引发一个未正确捕获的异常(即程序崩溃)时,您会立即在引发异常的位置登陆ipython的调试器。从那里开始,您可以上下移动堆栈,检查变量等。使用Python进行开发时,可以节省大量时间;我一直都在使用它。
答案 1 :(得分:3)
从Python 3.2开始,您可以使用以下内容:
python3 -m pdb -c c script.py
答案 2 :(得分:2)
它完全按照你的描述工作,并希望它在python 3.3--中使用.pdbrc文件中的'c'字符。
pdb
模块文档说明这是在3.2中添加的:
在3.2版中更改:.pdbrc现在可以包含继续调试的命令,例如continue或next。以前,这些命令没有效果。
答案 3 :(得分:1)
这可能不是它的方法。
你应该修改/扩展现有的pdb.py.代码如下所示:
while True:
try:
pdb._runscript(mainpyfile)
if pdb._user_requested_quit:
break
print "The program finished and will be restarted"
except:
traceback.print_exc()
print "Uncaught exception. Entering post mortem debugging"
print "Running 'cont' or 'step' will restart the program"
t = sys.exc_info()[2]
pdb.interaction(None, t)
print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"
看起来你可以用类似
的东西替换`pdb._runscript(mainpyfile)'runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True)
(来自PEP 338)。
不是一个完整的解决方案,我还没有测试过,但也许它会有所帮助。
编辑:但是对于更简单的解决方案,对于单个脚本,您的脚本可能以以下内容结束:
if __name__ == '__main__':
call_main_function()
你只需将它替换它
if __name__ == '__main__':
try:
call_main_function()
except:
import pdb
t = sys.exc_info()[2]
pdb.interaction(None, t)
(最后一个代码是从pdb.py中窃取的,这正是它在获得未处理的异常时的作用)。
答案 4 :(得分:0)
你某些它实际上没有运行吗?来自文档
当作为脚本调用时,如果正在调试的程序异常退出,pdb将自动进入事后调试。在事后调试(或正常退出程序)之后,pdb将重新启动程序。自动重启会保留pdb的状态(例如断点),并且在大多数情况下比在程序退出时退出调试器更有用。
强调我的。
当我运行我的程序试图找出它为什么做同样的事情(显示第一行代码)时,我一直在尝试不同的事情然后最后我注意到这一行:
程序完成并将重新启动
如果您的程序实际上是无异常运行然后重新启动,它将从程序的最开始处开始。
答案 5 :(得分:-2)
pdb
没有为您提供便利的命令。您可以尝试使用像PyDev的PyCharm这样的IDE。你可以做Corley Brigman建议的,或者你可以简单地使用IDE,这会让生活变得更轻松。