【问题标题】:Visual C++ program crashed, but no dumpfile generated. why?Visual C++ 程序崩溃,但没有生成转储文件。为什么?
【发布时间】:2012-05-27 04:17:51
【问题描述】:

我有一个很奇怪的情况。 我正在运行由 Visual Studio 2010 用 C++ 编写的 IOCP 服务器程序。

它使用'minidump',所以当出现诸如指针滥用之类的逻辑错误时,程序会因转储文件而崩溃,因此我可以找出代码中的崩溃点。

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

什么情况导致SetUnhandledExceptionFilter() 不工作? 有人知道这个问题吗?我想不通。

【问题讨论】:

标签: c++ dump iocp


【解决方案1】:

好吧,您当然不知道,因为您没有可查看的小型转储。当 SetUnhandledExceptionFilter 回调触发时,您应该做绝对最小值。该过程处于危险状态。它崩溃了。锁可能会被持有,堆锁特别麻烦。你不能指望 MiniDumpWriteDump() 会成功。

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

【讨论】:

  • 我不明白MiniDumpWriteDump 从另一个进程运行时如何有更多成功的机会。如果持有锁,则持有这些锁。哪个进程试图访问锁定的资源并不重要。另外,由于MiniDumpWriteDump 不是线程安全的,因此无论哪种方式都注定要失败。除非您可以同步所有线程(您不能同步,因为您的程序处于不确定状态),否则无法保证成功。你所说的听起来有道理,但并没有说明为什么保护过程会有更高的成功机会。
  • 线程安全无关紧要,你只有一个线程调用 MiniDumpWriteDump()。进程是否如此损坏,以至于 MDWD 需要完成其工作的 CreateFile() 和 HeapAlloc() 等基本调用可能会失败,这无疑是一个问题。它是一种过滤器,如果您在进程中执行此操作,那么您将永远不会看到无法调试的真正糟糕的崩溃。也许是好事。
  • 感谢您的回复。这里仍然不太相信:如果一个进程损坏到CreateFile 失败(纠正我,但除非内核内存损坏,它会失败吗?)那么你也可以争辩说SetEvent 会。 HeapAlloc 基本上也是如此,除非它对 OOM 失败。不过,我会假设 MDWD 可以处理“预分配”静态数据——这也可以解释为什么它不是线程安全的。在不太技术性的说明中,您是否有一个生成的小型转储脱离上下文,而进程内解决方案可能没有?
  • 不太确定我能说服你什么,听起来工作量很大。请点击按钮。
  • 你当然没有来说服我。但是,由于我对您提出的答案的准确性提出了质疑,因此如果可以的话,那将是愚蠢的。我真的很感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多