我依靠Windows 错误报告为大型多线程应用程序创建完整的用户模式转储。我知道当我开始使用它时(2012 年初),这些转储包含所有应用程序内存,以及在应用程序崩溃时准确的所有线程的完整堆栈(引发未处理的异常等)。但在去年的某个未知时刻,WER 创建的故障转储发生了变化。它们仍然包含所有内存,但只显示一个线程,并且堆栈似乎来自进程已经关闭之后:
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_LdrShutdownProcess@0() + 0x141 bytes
ntdll.dll!_RtlExitUserProcess@4() + 0x74 bytes
kernel32.dll!_UnhandledExceptionFilter@4() + 0x18928 bytes
这是一个使用 VS2010 SP1 编译的非托管(无法管理?)32 位 C++ 应用程序,在 64 位 Win7 SP1 上运行(并保持更新)。有谁知道去年改变了 WER 行为的任何 Windows 更新?除了“HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\AppName.exe”之外,还有什么可配置的吗?
此外,通过调用“RaiseFailFastException”来终止应用程序仍然会导致良好的转储,并为所有线程提供有效的堆栈。