5

我想让我的调试器在post_mortem()遇到异常时运行,不必修改我正在处理的源代码。我看到很多涉及将代码包装在 try/except 块中的示例,但无论我在做什么,我都希望它始终运行。

我研究了一个 python 包装脚本,但它变得丑陋而且几乎无法使用。

我使用pudb,它与 pdb 的 API 等效,因此特定于 pdb 的答案很好。我从我的编辑器 (vim) 中运行代码,并希望在遇到异常时随时出现 pm。

4

3 回答 3

7

花了几个月没有做任何事情,但我偶然发现了一个解决方案。我敢肯定,对于更有经验的人来说,这并不是什么新鲜事。

我的环境中有以下内容:

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__. 我发现总是能够依赖某些可用的工具非常方便。

调味。

于 2013-12-25T02:21:49.293 回答
1

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.

于 2013-05-06T06:52:49.610 回答
0

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_traceprogram.pyc

于 2020-05-13T08:22:58.510 回答