在 python 应用程序退出之前捕获它
Posted
技术标签:
【中文标题】在 python 应用程序退出之前捕获它【英文标题】:Catching a python app before it exits 【发布时间】:2011-02-01 21:16:03 【问题描述】:我有一个 python 应用程序,它应该是非常长寿的,但有时这个过程就消失了,我不知道为什么。发生这种情况时没有任何记录,所以我有点茫然。
在代码中是否有某种方法可以连接到退出事件,或者是否有其他方法可以让我的一些代码在进程退出之前运行?我想记录内存结构的状态,以便更好地了解发生了什么。
【问题讨论】:
【参考方案1】:atexit
发音为“退出时”。我第一次读到这个函数名时,我把它读作“一个 texit”,这 几乎 没有多大意义。
【讨论】:
情况可能会更糟;例如,模块作者可能在工作中度过了忙碌的一天,因此他们在事后为模块命名。 ;)【参考方案2】:您可以尝试直接从控制台运行您的应用程序(windows 上的 cmd,unix 上的 sh/bash/etc),这样您就可以看到进程终止时打印到控制台的任何堆栈跟踪等。
【讨论】:
【参考方案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 调试器中,假设发生了一些“坏事”导致异常。我猜可能 stderr/stdout 已被捕获,而您没有看到异常?
即搜索类似的内容:
sys.stdout = open('stdout.log', 'w')
sys.stderr = open('stderr.log', 'w')
如果进程毫无例外地死亡,那么这可能更难找到。 Windows 上的一种(非常困难的方法)是使用诸如 windbg 之类的东西附加到进程并在 CRT 中的某个相关位置设置断点。
祝你好运!
【讨论】:
以上是关于在 python 应用程序退出之前捕获它的主要内容,如果未能解决你的问题,请参考以下文章