我有一个非常奇怪的情况。我正在运行由 Visual Studio 2010 用 C++ 编写的 IOCP 服务器程序。
它使用'minidump',所以当出现诸如指针滥用之类的逻辑错误时,程序会因转储文件而崩溃,因此我可以找出代码中的崩溃点在哪里。
有时(很少),程序崩溃并且没有转储文件。
什么情况下SetUnhandledExceptionFilter()
不工作?有人知道这个问题吗?我想不通。
好吧,您当然不知道,因为您没有要查看的小型转储。当 SetUnhandledExceptionFilter 回调触发时,您应该做绝对最小值。该过程处于危险状态。它崩溃了。锁可能会被持有,堆锁特别麻烦。你不能指望 MiniDumpWriteDump() 会成功。
您需要的是一个等待命名事件的小守护进程。尽早在您的 main() 函数中启动它并将您的进程 ID 传递给它。守卫进程等待该事件和您的进程句柄。在您的异常回调中,只需发出事件信号并立即休眠很长时间。这会唤醒守卫进程,它会调用 MiniDumpWriteDump() 以及让您了解崩溃的任何其他必要信息。并杀死你的主程序。