提前道歉,因为这不是一个非常好的问题。
我有一个服务器应用程序在专用Windows服务器上作为服务运行。非常随机地,此应用程序会崩溃并且没有任何提示可以说明崩溃的原因。
当它崩溃时,事件日志中有一条记录说明应用程序失败了,但没有任何线索表明原因。它还提供了一些关于故障模块的信息,但似乎不太可靠,因为每次崩溃时故障模块通常都不同。例如,最新的说是ntdll,之前的说是libmysql,再之前的说是netsomething等等。
应用程序中的每个线程都包含在try/catch (...)
(从异常处理程序抛出/未特别捕获的任何内容)、__try/__except
(结构化异常)和try/catch
(特定的C++异常)中。该应用程序使用/EHa编译,因此catch all也将捕获结构化异常。
所有这些异常处理程序都做同样的事情。首先,创建一个崩溃转储。其次,在磁盘上记录一个新文件的条目。第三,在应用程序日志中记录一个条目。在这些崩溃的情况下,所有这些都没有发生。最底层的异常处理程序(try/catch (...)
)什么也不做,只是终止线程。主应用程序线程处于睡眠状态,没有机会抛出异常。
应用程序日志文件停止记录。不久之后,监视服务器的进程注意到它不再响应,发送警报,并重新启动它。如果服务器监视器注意到服务器仍在运行,但只是没有响应,则会对进程进行转储并报告此情况,但这并没有发生。
除了未捕获的异常之外,我能想到的唯一原因是调用exit
或类似函数。搜索代码没有找到任何可能终止进程的函数调用。我还确保程序没有正常终止(即服务管理器的停止请求)。
我们尝试使用windbg附加(无法使用Visual Studio,开销太大),但当崩溃发生时它没有报告任何内容。
什么原因会导致应用程序像这样崩溃?我们开始没有更多的选择,考虑可能是硬件故障,但这对我来说似乎有点不太可能。