我想让我的调试器在遇到异常时运行post_mortem()
,没有必须修改我正在处理的源。我看到很多例子涉及在try / except块中包装代码,但我想让它始终运行,无论我在做什么。
我使用了一个python包装器脚本但是它变得丑陋且几乎无法使用。
我使用pudb,这是与pdb等效的API,因此pdb特定的答案很好。我在我的编辑器(vim)中运行代码,并希望在遇到异常时让pm出现。
答案 0 :(得分:6)
花了几个月的时间没有采取任何措施,但我偶然发现了一个解决方案。我相信对于经验更丰富的人来说,这并不是什么新鲜事。
我的环境中有以下内容:
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__
的问题。我发现总是能够依赖某些可用的工具非常方便。
答案 1 :(得分:1)
一个可能的解决方案是调用pdb
(我不知道pudb
,但我会假设它的工作原理与脚本相同):
python -m pdb script.py
当作为脚本调用时,pdb将自动进入验尸 调试正在调试的程序是否异常退出。后 事后调试(或正常退出程序后),pdb会 重启程序。
答案 2 :(得分:0)
pdb
自Python 3.2 以来的解决方案是通过-m pdb
在调试器下启动程序,并通过-c c
告诉pdb继续:
python3 -m pdb -c c program.py
作为脚本调用时,如果要调试的程序异常退出,pdb将自动进入事后调试。在事后调试之后(或在程序正常退出之后),pdb将重新启动程序。
截至pudb 2019.2 :根据the pudb documentation,官方方式涉及对代码进行一些更改(即使这样,如果没有,我也不会进入验尸模式我刚刚运行python3 program.py
!):
要启动调试器而不实际暂停使用:
from pudb import set_trace; set_trace(paused=False)
位于代码顶部。这将在不中断调试器的情况下启动调试器,并运行调试器,直到达到预定义的断点为止。您还可以在调试器内部的set_trace调用上按b,这样可以阻止它在此停止。
尽管可以通过python3 -m pudb.run program.py
在调试器下正确启动程序,但是pudb的命令行参数不支持pdb的-c c
之类的东西。 pudb的--pre-run=COMMAND
用于外部命令,而不是pudb命令。
我目前正在执行的操作python3 -m pudb.run program.py
完全没有提到pudb
中的set_trace
或program.py
,然后按键盘上的c
。这样,在未处理的任何异常情况下,pudb都会进入事后检验模式。但是,只有当我知道将重现异常时,此方法才能很好地工作。为了查找偶尔出现的异常,我返回了pdb解决方案。