【发布时间】:2011-03-07 19:21:04
【问题描述】:
我想提前道歉,因为这不是一个很好的问题。
我有一个在专用 Windows 服务器上作为服务运行的服务器应用程序。非常随机地,此应用程序崩溃并且没有提示导致崩溃的原因。
当它崩溃时,事件日志中有一个条目说明应用程序失败,但没有提供原因的线索。它还提供了有关故障模块的一些信息,但似乎不太可靠,因为故障模块通常在每次崩溃时都不同。比如最新的说是ntdll,之前的说是libmysql,之前的说是netsomething,以此类推。
应用程序中的每个线程都包装在try/catch (...)(从异常处理程序抛出/未专门捕获的任何内容)、__try/__except(结构化异常)和try/catch(特定 C++ 异常)中。应用程序是使用 /EHa 编译的,因此 catch all 也会捕获结构化异常。
所有这些异常处理程序都做同样的事情。首先,创建故障转储。其次,将条目记录到磁盘上的新文件中。第三,在应用程序日志中记录一个条目。在这些崩溃的情况下,这一切都没有发生。最底层的异常处理程序(try/catch (...))什么都不做,它只是终止线程。主应用线程处于休眠状态,没有机会抛出异常。
应用程序日志文件只是停止记录。不久之后,监视服务器的进程注意到它不再响应,发送警报,然后再次启动它。如果服务器监视器注意到服务器仍在运行,但只是没有响应,它会转储进程并报告此情况,但这并没有发生。
除了未捕获的异常,我能想到的唯一其他原因是调用exit 或类似的。搜索代码不会调用任何可能终止进程的函数。我还确保程序没有正常终止(即来自服务管理器的停止请求)。
我们已经尝试在附加windbg的情况下运行它(没有机会使用Visual Studio,开销太高),但是发生崩溃时它没有报告任何内容。
什么会导致应用程序像这样崩溃?我们开始用尽选项,并认为这可能是硬件故障,但这对我来说似乎不太可能。
【问题讨论】:
-
日志文件流是否被刷新?
-
您是否验证过您的线程异常处理程序确实在服务器上工作?他们可能正在尝试生成故障转储和其他日志记录,但缺乏写入其目标位置等的权限......
-
是的,当然。他们发现了一些错误。