我怎样才能追溯调试python异常

时间:2010-11-26 21:47:55

标签: python debugging

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

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

我的第一个(注定要死的!)方法是在程序的最高级别放置一个try / except块,在except块中从当前异常中提取traceback对象并使用pickle将其写入磁盘。我打算然后编写一个单独的程序来解开对象并使用pdb.post_mortem来调试崩溃的程序。但追溯对象不是可选择的,但我不希望它仍然可以工作,因为它不会挽救整个程序状态。

6 个答案:

答案 0 :(得分:1)

据我所知,没有办法做你所要求的。也就是说,听起来你可能正在寻找一个远程调试器。有几种选择:

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

答案 1 :(得分:0)

你可以做的是使用twisted.python并将回溯写入文件,它会为你提供一个精确的回溯,包括异常

答案 2 :(得分:0)

嗯,据我所知,这个问题没有简单的解决办法。您可能想尝试这种方法:How do I find what is using memory in a Python process in a production system?

答案 3 :(得分:0)

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

myEnv = {}
myEnv.update(globals)

然后在该执行环境中执行您的代码。如果发生异常,则会有traceback(堆栈)和所有全局变量,因此您可以很好地重建程序状态。

答案 4 :(得分:0)

在捕获异常时,在堆栈展开之前,状态可供检查模块检查:http://docs.python.org/2/library/inspect.html

通常,您将在traceback对象上使用inspect.getinnerframes。每个堆栈帧中的局部变量都以.f_locals形式提供,因此您可以看到它们是什么。

困难的部分是正确地序列化所有这些:根据您在本地范围内的类型,您可能或可能无法腌制它们,将它们转储到JSON,或其他任何东西。

答案 5 :(得分: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 options例如raise new_exc from original_exc raise OtherException(...).with_traceback(tb)