我想让我的调试器在post_mortem()
遇到异常时运行,而不必修改我正在处理的源代码。我看到很多涉及将代码包装在 try/except 块中的示例,但无论我在做什么,我都希望它始终运行。
我研究了一个 python 包装脚本,但它变得丑陋而且几乎无法使用。
我使用pudb,它与 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__
. 我发现总是能够依赖某些可用的工具非常方便。
调味。
A possible solution is to invoke pdb
(I don't know about pudb
, but I'll just assume it works the same) as a script:
python -m pdb script.py
Quoting the the documentation:
When invoked as a script, pdb will automatically enter post-mortem debugging if the program being debugged exits abnormally. After post-mortem debugging (or after normal exit of the program), pdb will restart the program.
pdb
自 Python 3.2 以来的一个解决方案是在调试器下启动程序 via-m pdb
并告诉 pdb 继续 via -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 的命令行参数不支持 pdb 的-c c
. pudb--pre-run=COMMAND
用于外部命令,而不是 pudb 命令。
我目前所做的是不python3 -m pudb.run program.py
提及pudb
或根本不运行并按下键盘。这样 pudb 在出现任何未处理的异常时都会进入其事后分析模式。然而,只有当我知道异常将被复制时,这才有效。为了寻找偶尔发生的异常,我回到 pdb 解决方案。set_trace
program.py
c