在退出之前捕获python应用程序

时间:2010-03-29 01:54:56

标签: python crash

我有一个python应用程序应该是非常长寿的,但有时这个过程就会消失,我不知道为什么。当发生这种情况时,什么都没有记录,所以我有点不知所措。

在代码中是否有某种方法可以挂钩到退出事件,或者其他一些方法让我的一些代码在进程退出之前运行?我想记录内存结构的状态,以便更好地了解正在发生的事情。

3 个答案:

答案 0 :(得分:8)

atexit发音为“退出”。我第一次读到这个函数名时,我把它读成“一个texit”,这并没有使几乎有多大意义。

答案 1 :(得分:3)

您可以尝试直接从控制台运行应用程序(Windows上的cmd,unix上的sh / bash / etc),这样您就可以在进程终止时看到打印到控制台的任何堆栈跟踪等。

答案 2 :(得分:3)

我不确定您是否能够修改源代码,但如果是这样,您可能想尝试这样做:

def debugexcept(type, value, tb):
    if hasattr(sys, 'ps1') or not (sys.stderr.isatty() and sys.stdin.isatty()) or type == SyntaxError:
        sys.__excepthook__(type, value, tb)
    else:
        import traceback, pdb
        traceback.print_exception(type, value, tb)
        print
        pdb.pm()


sys.excepthook = debugexcept

如果从命令行启动python程序,则应该在python调试器停止时将其转储到python调试器中,假设发生了“坏”事件导致异常。我猜可能已经捕获了stderr / stdout并且你没有看到一些异常?

即搜索类似的内容:

sys.stdout = open('stdout.log', 'w')
sys.stderr = open('stderr.log', 'w')

如果该过程完全没有例外,那么可能更难找到。 Windows上的一个(非常困难的方法)是使用类似windbg的东西附加到进程并在某个相关位置在CRT中设置断点。

祝你好运!