Windows错误报告何时创build转储文件? 它是可configuration的吗? 这在Windows 7中改变了吗?

我依靠Windows错误报告为大型multithreading应用程序创build完整的用户模式转储。 我知道,当我开始使用它(2012年初)时,这些转储包含所有应用程序内存,以及所有线程的完整栈,这些栈在应用程序崩溃时抛出(抛出未处理的exception等)。 但在去年的某个未知点,WER创build的崩溃转储已经改变。 它们仍然包含所有的内存,但只显示一个线程,并且在进程已经closures之后堆栈看起来像是来自:

ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes ntdll.dll!_LdrShutdownProcess@0() + 0x141 bytes ntdll.dll!_RtlExitUserProcess@4() + 0x74 bytes kernel32.dll!_UnhandledExceptionFilter@4() + 0x18928 bytes 

这是一个非托pipe(不可pipe理的)32位C ++应用程序,使用VS2010 SP1编译,在64位Win7 SP1上运行(并保持更新)。 有谁知道任何Windows更新已经改变了去年的WER行为? 除了“HKLM \ SOFTWARE \ Microsoft \ Windows \ Windows错误报告\ LocalDumps \ AppName.exe”之外是否还有其他configuration?

另外,通过调用“RaiseFailFastException”来杀死应用程序仍然会导致所有线程都有一个有效的堆栈。

啊哈! 第三方库调用SetUnhandledExceptionFilter,从而阻止Windows错误报告获取原始异常。 他们的处理程序做了一些内部清理,然后叫中止,此时WER终于能够创建一个转储。

对于任何遇到这种问题的人,我建议检查已安装的处理程序(SetUnhandledExceptionFilter,set_terminate等的返回值)是否是您期望的(如果您依赖WER,或者您自己的处理程序或CrashRpt,则为null)。

当它崩溃时,让自己的应用程序自我转储写入程序更好。 你只需要调用SetUnhandledExceptionFilter函数,指定回调。 在回调中,使用带有MiniDumpWithFullMemory转储类型的MiniDumpWriteDump函数。

你的异常过滤器将会在你的代码发生异常时被调用。 在回调中,枚举并暂停进程的所有其他线程会更好。

您可能还需要为SetUnhandledExceptionFilter本身安装一个钩子! 为什么? 那么, CRT总是禁用任何安装的异常过滤器,并通过挂钩功能,你可以避免这一点。