Windows错误报告何时创建转储文件?它是否可配置?这在Windows 7中有改变吗?
When does Windows Error Reporting create a dump file? Is it configurable? Has this changed in Windows 7?
我依靠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上(并保持更新)。有人知道去年有什么Windows更新改变了WER的行为吗?除了"HKLMSOFTWAREMicrosoftWindowsWindows错误报告LocalDumpsAppName.exe"之外,还有其他可配置的东西吗?
此外,通过调用'RaiseFailFastException'来终止应用程序仍然会产生一个良好的转储,并为所有线程提供有效的堆栈。
啊哈!第三方库正在调用SetUnhandledExceptionFilter,这阻止了Windows错误报告获得原始异常。它们的处理程序做了一些内部清理,然后调用abort,此时WER最终能够创建转储。
对于遇到这种问题的任何人,我建议检查已安装的处理程序(SetUnhandledExceptionFilter, set_terminate等的返回值)是否符合您的期望(如果您依赖于WER,或您自己的处理程序或CrashRpt,则为空)。
最好在应用程序崩溃时设置为自转储编写器。你只需要调用SetUnhandledExceptionFilter函数,指定回调。回调时使用MiniDumpWriteDump函数,MiniDumpWithFullMemory
转储类型
异常过滤器将在发生未处理(由代码)异常时调用。在回调中,最好枚举并挂起进程的所有其他线程。
您可能还需要为SetUnhandledExceptionFilter
本身安装一个钩子!为什么?好吧,CRT总是禁用任何安装的异常过滤器,并且通过钩函数,您可以避免这种情况。
- Windows.h 输入在函数之外不起作用
- C++20 个模块在 clang (Windows):在最简单的示例中键入信息错误
- 以相反的顺序打印数组 - 为什么这在C++中是错误的?
- 这在 C++ 类和对象中指向此指针
- 这在C++是什么类型的错误?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- Windows 服务在启动时不进入_tmain
- 为什么这在 c++ 中不起作用,但在 python 中工作
- 这->...在模板包装类中必需
- 如何强制Windows.h在Visual Studio中静态链接而不是动态链接?
- 这"在比赛中为m,n"做什么?
- 我需要哪个SDK确保Windows 7在Visual Studio C 2017中的兼容性
- 这在技术上可能是可能的
- 这在 C# 中意味着什么以及如何使用它
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 是返回*这在 C++ 中是安全的
- 通过值或通过引用返回类对象,这在这里会更快
- 这在 C++ 中是如何工作的,并且在 JavaScript 中有任何粗略的等价物?
- 在插入时同时迭代一个映射,这在什么方面是不安全的
- Windows错误报告何时创建转储文件?它是否可配置?这在Windows 7中有改变吗?