2010-11-26 75 views
6

我正在寻找一种方法来“回顾”调试python异常。本质上,如果我的程序引发了一个未处理的异常,我希望它能够保存程序状态,以便稍后返回并调试问题。我如何追溯调试python异常

我已经看了一下pdb文档,看来你可以做到这一点,但前提是你可以在异常时与程序进行交互。这对我来说不起作用,因为程序将在后台运行(没有控制终端)。

我的第一个(注定失败!)方法是在我的程序的最高级别放置try/except块,并在except块中从当前异常中提取traceback对象并使用pickle将其写入磁盘。然后,我计划编写一个单独的程序,以取消对象的使用并使用pdb.post_mortem来调试崩溃的程序。但是回溯对象不是可以选择的,但我不希望它能够继续工作,因为它不会保存整个程序状态。

+2

这并不能解决您的问题,而是将您的整个程序包装在`try`语句中,可能更好的方法是将未捕获的异常分配给[`sys.excepthook`]( http://docs.python.org/library/sys.html#sys.excepthook)。 – aaronasterling 2010-11-26 22:20:20

回答

0

你可以做的是使用twisted.python和回溯写入一个文件,它给你一个准确的追踪,包括异常

+0

还有`traceback`模块。但我不认为这是OP想要的。 – knitti 2010-11-26 22:09:54

+0

我不确定那会做我以后的事情。当异常被捕获时,我可以将traceback转储到文件中,但是我真正想要的是一种在事实之后交互式调试程序的方式(就像使用gdb调试核心文件一样)。 – 2010-11-30 20:52:19

1

据我所知,没有任何方式做自己“问。这就是说,这听起来像你可能正在寻找一个远程调试器。有几个选项:

  • rconsole - 这不是一个真正的调试器,但它允许您在另一个进程中获得交互提示。这对调试有用。我没有尝试过,但看起来相对简单。
  • rpdb2's embedded debugger - 这可以让你启动一个调试器,然后从另一个shell连接到它。
0

您可以创建在顶层一个完全独立的执行环境:

myEnv = {} 
myEnv.update(globals) 

然后就是执行环境中执行代码。如果发生异常,你有回溯(堆栈)和所有全局变量,所以你可以很好地重建程序状态。

0

目前异常被捕获,前栈被松开,国家可用于与检查模块检查:http://docs.python.org/2/library/inspect.html

一般地你会用你的inspect.getinnerframes追踪对象。每个堆栈帧中的局部变量都可以作为.f_locals使用,因此您可以看到它们是什么。

困难的部分是正确地序列化所有这些:取决于你在本地范围内有哪些类型,你可以或不可以腌制它们,将它们转储到JSON或其他任何类型。

0

我希望这有助于(它帮助我):

import logging, traceback 
_logger = logging.getLogger(__name__) 

try: 
    something_bad() 
except Exception as error: 
    _logger.exception("Oh no!") # Logs original traceback 
    store_exception_somewhere(error) 

此外,in Python 3 there are a few new optionsraise new_exc from original_exc raise OtherException(...).with_traceback(tb)