在Python应用退出前捕获它

9 投票
3 回答
2189 浏览
提问于 2025-04-15 20:58

我有一个Python应用程序,应该能长时间运行,但有时候这个程序会突然消失,我也不知道为什么。发生这种情况时,没有任何日志记录,所以我有点无从下手。

有没有什么办法可以在代码中捕捉到程序退出的事件,或者其他方法让我在程序退出前运行一些代码?我想记录一下内存结构的状态,以便更好地理解发生了什么。

3 个回答

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调试器,前提是发生了一些“坏事”导致了异常。我猜可能是标准错误输出和标准输出被捕获了,所以你看不到一些异常信息?

也就是说,可以搜索类似这样的内容:

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

如果程序崩溃时根本没有异常,那可能就更难找了。在Windows上,有一种(非常困难的方法)是使用像windbg这样的工具来附加到进程上,并在CRT的某个相关位置设置一个断点。

祝你好运!

3

你可以试着直接从命令行运行你的应用程序(在Windows上是cmd,在Unix系统上是sh/bash等),这样当程序崩溃时,你可以看到任何错误信息和调用栈等内容直接显示在命令行上。

8

atexit这个词的发音是“在退出时”。我第一次看到这个函数名的时候,读成了“a texit”,这可就没什么意义了。

撰写回答