C++ visualc&x2B+;程序崩溃,但未生成转储文件。为什么?

C++ visualc&x2B+;程序崩溃,但未生成转储文件。为什么?,c++,dump,iocp,C++,Dump,Iocp,我的处境很奇怪。 我正在运行Visual Studio 2010在C++中编写的IOCP服务器程序。 它使用“minidump”,所以当出现诸如指针误用之类的逻辑错误时,程序会使用dump文件崩溃,这样我就可以找出代码中的崩溃点 有时(很少),程序崩溃并且没有转储文件 什么情况使SetUnhandledExceptionFilter()无法工作? 有人知道这个问题吗?我搞不懂。嗯,你当然不知道,因为你没有小型垃圾场可看。当启动SetUnhandledExceptionFilter回调时,应该执行

我的处境很奇怪。 我正在运行Visual Studio 2010在C++中编写的IOCP服务器程序。 它使用“minidump”,所以当出现诸如指针误用之类的逻辑错误时,程序会使用dump文件崩溃,这样我就可以找出代码中的崩溃点

有时(很少),程序崩溃并且没有转储文件

什么情况使
SetUnhandledExceptionFilter()
无法工作?
有人知道这个问题吗?我搞不懂。

嗯,你当然不知道,因为你没有小型垃圾场可看。当启动SetUnhandledExceptionFilter回调时,应该执行绝对最小值。这一进程处于危险状态。它坠毁了。锁可能被持有,堆锁特别麻烦。您不能期望MinidumpWriteUp()成功


您需要的是一个等待命名事件的小守护进程。在main()函数中尽早启动它,并将进程ID传递给它。守护进程将同时等待该事件和进程句柄。在异常回调中,只需向事件发送信号并立即长时间休眠。这会唤醒守护进程,它会调用MiniDumpWriteDump()以及任何其他必要的函数来让您知道崩溃的情况。并杀死你的主程序。

我不明白当从另一个进程运行时,
minidumpWriteDomainp
怎么还有机会成功。如果锁被保持,则这些锁被保持。无论哪个进程试图访问锁定的资源。另外,由于
minidumpWriteMap
不是线程安全的,所以无论哪种方式,您都注定要失败。除非您可以同步所有线程(您不能,因为您的程序处于不确定状态),否则无法保证成功。您所说的听起来似乎有道理,但并没有说明为什么guard进程会有更高的成功几率。线程安全性不重要,您只有一个线程调用MiniDumpWriteDump()。进程是否已损坏,以至于MDWD完成其任务所需的CreateFile()和HeapAlloc()等基本调用可能会失败,这无疑是一个问题。它是一种过滤器,如果您在进程中进行,那么您将永远不会看到无法调试的真正严重的崩溃。也许是件好事。谢谢你的回复。这里仍然不太确信:如果一个进程损坏得太厉害以至于
CreateFile
失败(请纠正我,除非内核内存损坏,否则它会失败吗?),那么您也可以认为
SetEvent
会失败。基本上,
HeapAlloc
也是如此,除非它在OOM中失败。不过,我假设MDWD在“预分配”静态数据上工作——这也解释了为什么它不是线程安全的。在一个不那么技术性的问题上,您是否有一个根据上下文生成的小型转储,而进程中的解决方案可能没有?我不太确定我必须说服您什么,听起来需要做很多工作。请点击提问按钮。当然你不必说服我。但既然我对你提出的答案的准确性提出了质疑,如果你能做到的话,不这样做是愚蠢的。我真的很感兴趣。