我有一个python应用程序应该是非常长寿的,但有时这个过程就会消失,我不知道为什么。当发生这种情况时,什么都没有记录,所以我有点不知所措。
在代码中是否有某种方法可以挂钩到退出事件,或者其他一些方法让我的一些代码在进程退出之前运行?我想记录内存结构的状态,以便更好地了解正在发生的事情。
答案 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中设置断点。
祝你好运!