我正在寻找一种“回顾性地”调试python异常的方法。基本上如果我的程序引发了一个未处理的异常,我希望它能够保存程序状态,以便我可以稍后再调试问题。
我已经看了一下pdb文档,看起来你可以这样做,但前提是你可以在异常时与程序进行交互。这对我不起作用,因为程序将在后台运行(没有控制终端)。
我的第一个(注定要死的!)方法是在程序的最高级别放置一个try / except块,在except块中从当前异常中提取traceback对象并使用pickle将其写入磁盘。我打算然后编写一个单独的程序来解开对象并使用pdb.post_mortem来调试崩溃的程序。但追溯对象不是可选择的,但我不希望它仍然可以工作,因为它不会挽救整个程序状态。
答案 0 :(得分:1)
据我所知,没有办法做你所要求的。也就是说,听起来你可能正在寻找一个远程调试器。有几种选择:
答案 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)
。