总是在异常时总是调用python调试器的一般方法

时间:2013-05-06 05:22:50

标签: python vim exception-handling pdb pudb

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

我使用了一个python包装器脚本但是它变得丑陋且几乎无法使用。

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

3 个答案:

答案 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

引用the documentation

  

当作为脚本调用时,pdb将自动进入验尸   调试正在调试的程序是否异常退出。后   事后调试(或正常退出程序后),pdb会   重启程序。

答案 2 :(得分:0)

pdb 自Python 3.2 以来的解决方案是通过-m pdb在调试器下启动程序,并通过-c c告诉pdb继续:

python3 -m pdb -c c program.py

引用the pdb documentation

作为脚本调用时,如果要调试的程序异常退出,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_traceprogram.py,然后按键盘上的c。这样,在未处理的任何异常情况下,pudb都会进入事后检验模式。但是,只有当我知道将重现异常时,此方法才能很好地工作。为了查找偶尔出现的异常,我返回了pdb解决方案。