【发布时间】:2012-05-27 04:17:51
【问题描述】:
我有一个很奇怪的情况。 我正在运行由 Visual Studio 2010 用 C++ 编写的 IOCP 服务器程序。
它使用'minidump',所以当出现诸如指针滥用之类的逻辑错误时,程序会因转储文件而崩溃,因此我可以找出代码中的崩溃点。
有时(很少),程序崩溃并且没有转储文件。
什么情况导致SetUnhandledExceptionFilter() 不工作?
有人知道这个问题吗?我想不通。
【问题讨论】:
我有一个很奇怪的情况。 我正在运行由 Visual Studio 2010 用 C++ 编写的 IOCP 服务器程序。
它使用'minidump',所以当出现诸如指针滥用之类的逻辑错误时,程序会因转储文件而崩溃,因此我可以找出代码中的崩溃点。
有时(很少),程序崩溃并且没有转储文件。
什么情况导致SetUnhandledExceptionFilter() 不工作?
有人知道这个问题吗?我想不通。
【问题讨论】:
好吧,您当然不知道,因为您没有可查看的小型转储。当 SetUnhandledExceptionFilter 回调触发时,您应该做绝对最小值。该过程处于危险状态。它崩溃了。锁可能会被持有,堆锁特别麻烦。你不能指望 MiniDumpWriteDump() 会成功。
您需要的是一个等待命名事件的小守护进程。尽早在您的 main() 函数中启动它并将您的进程 ID 传递给它。守卫进程等待该事件和您的进程句柄。在您的异常回调中,只需发出事件信号并立即休眠很长时间。这会唤醒守卫进程,它会调用 MiniDumpWriteDump() 以及让您了解崩溃的任何其他必要信息。并杀死你的主程序。
【讨论】:
MiniDumpWriteDump 从另一个进程运行时如何有更多成功的机会。如果持有锁,则持有这些锁。哪个进程试图访问锁定的资源并不重要。另外,由于MiniDumpWriteDump 不是线程安全的,因此无论哪种方式都注定要失败。除非您可以同步所有线程(您不能同步,因为您的程序处于不确定状态),否则无法保证成功。你所说的听起来有道理,但并没有说明为什么保护过程会有更高的成功机会。
CreateFile 失败(纠正我,但除非内核内存损坏,它会失败吗?)那么你也可以争辩说SetEvent 会。 HeapAlloc 基本上也是如此,除非它对 OOM 失败。不过,我会假设 MDWD 可以处理“预分配”静态数据——这也可以解释为什么它不是线程安全的。在不太技术性的说明中,您是否有一个生成的小型转储脱离上下文,而进程内解决方案可能没有?