我想让我的调试器运行以下内容 post_mortem()
遇到异常时。橆 不得不修改我正在处理的源代码。我看到很多例子都涉及到用 tryexcept 块来包装代码,但我想让它始终运行,不管我在做什么。
我曾做过一个python的包装脚本,但它变得很丑陋,而且几乎无法使用。
我使用了 泥巴这相当于pdb的API,所以pdb专用的答案也可以。我在我的编辑器(vim)中运行代码,希望在遇到异常时,pm能随时出现。
花了几个月的时间没有做任何事情,但我偶然发现了一个解决方案。我相信对于比较有经验的人来说,这已经不是什么新鲜事了。
我的环境里有以下内容。
export PYTHONUSERBASE=~/.python
export PYTHONPATH=$PYTHONPATH:$PYTHONUSERBASE
我有以下文件:
~/.python/lib/python2.7/site-packages/usercustomize.py
有以下内容
import traceback
import sys
try:
import pudb as debugger
except ImportError:
import pdb as debugger
def drop_debugger(type, value, tb):
traceback.print_exception(type, value, tb)
debugger.pm()
sys.excepthook = drop_debugger
__builtins__['debugger'] = debugger
__builtins__['st'] = debugger.set_trace
现在,不管是交互式还是其他方式 调试器总是在出现异常的时候跳出来 如果能让它更聪明一些,可能会更好。
重要的是要确保你没有任何的 no-global-site-packages.txt
在你 site-packages
. 这将禁用 usercustomize
模块,默认为 site.py
(我的virtualenv有一个 no-global-site-packages.txt
)
为了防止对其他人有所帮助,我在这里留下了关于修改 __builtins__
. 我发现它相当方便,总是能够依靠一些特定的工具是可用的。
味道要尝尝。
一个可能的解决方案是调用 pdb
(我不知道 pudb
,但我就认为它的工作原理是一样的)作为一个脚本。
python -m pdb script.py
引用 文件:
当作为脚本调用时,如果被调试的程序异常退出,pdb将自动进入事后调试。在事后调试后(或程序正常退出后),pdb将重新启动程序。
解决方法 pdb
自Python 3.2以来 是在调试器下通过 -m pdb
并告诉pdb继续通过 -c c
:
python3 -m pdb -c c program.py
引述 pdb文件:
当作为脚本调用时,如果被调试的程序异常退出,pdb将自动进入事后调试。在事后调试后(或程序正常退出后),pdb将重新启动程序。
截至pudb 2019.2:根据 pudb文件官方的方法是修改一下你的代码(即使如此,我也不会在死后模式下,如果我只运行了 python3 program.py
!):
要启动调试器而不实际暂停,请使用:
from pudb import set_trace; set_trace(paused=False)
在代码的顶部。这将在不中断的情况下启动调试器,并运行到预定义的断点。你也可以在调试器内部的set_trace调用中按b,这将防止它在那里停止。
虽然在调试器下可以通过以下方式正确启动程序 python3 -m pudb.run program.py
,pudb的命令行args不支持任何像pdb的 -c c
. pudb的 --pre-run=COMMAND
是用于外部命令,而不是pudb命令。
我现在做的是运行 python3 -m pudb.run program.py
不提 pudb
或 set_trace
在 program.py
并按 c
键盘上。这样pudb就会在任何未处理的异常时进入死后模式。然而,只有当我知道这个异常会被重现时,这种方式才会有效。对于偶尔出现的异常,我又回到了pdb的解决方案。