Gre*_*yer 6 c++ windows crash-reports windows-error-reporting
我依靠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错误报告\ LocalDumps\AppName.exe'之外,还有其他可配置的东西吗?
此外,通过调用'RaiseFailFastException'来终止应用程序仍然会导致所有线程都有一个有效堆栈的良好转储.
啊哈!第三方库正在调用SetUnhandledExceptionFilter,这阻止Windows错误报告获取原始异常。他们的处理程序进行了一些内部清理,然后称为中止,这时WER终于能够创建转储。
对于遇到此类问题的任何人,我建议检查安装的处理程序(SetUnhandledExceptionFilter,set_terminate等的返回值)是否符合您的期望(如果您依赖WER或您自己的处理程序或CrashRpt,则为null)。