【发布时间】:2021-10-14 03:05:47
【问题描述】:
背景
我有一个 C++ 命令行应用程序在 Windows 10 和 Windows Server 2016 上崩溃。崩溃的原因与这篇文章无关,实际上我已经修复了崩溃。在尝试解决此崩溃问题时,我使用this how-to 在 Windows 10 上启用崩溃报告转储。我编辑了注册表,并在HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps 中添加了以下键:
-
DumpFolder:C:\data0\CrashReports -
DumpCount:0x10 -
DumpType:0x2
我还确保C:\data0\CrashReports 对每个人都是可读写的。重新启动机器后,我运行我的应用程序再次崩溃,但没有转储崩溃报告。经过大量搜索和调试,我发现了this related Stackoverflow answer,在那里我了解到SetErrorMode( SEM_NOGPFAULTERRORBOX ) 将防止崩溃报告给Windows 错误报告。事实上,我的应用程序有这个调用来抑制对话框:
SetErrorMode(
SEM_FAILCRITICALERRORS |
SEM_NOALIGNMENTFAULTEXCEPT |
SEM_NOGPFAULTERRORBOX |
SEM_NOOPENFILEERRORBOX )
documentation for SetErrorMode 没有提到这一点。在这个标志中,它只说:
系统不显示 Windows 错误报告对话框。
尽管如此,SO 的答案似乎是正确的,因为当我从该调用中删除 SEM_NOGPFAULTERRORBOX 并保留其他三个标志时,我得到了我需要调试和修复我的崩溃的崩溃报告。事实上,我的崩溃也开始出现在事件查看器中。因此,显然,SEM_NOGPFAULTERRORBOX 不会只是抑制 WER 对话框;它也禁止崩溃报告转储和事件查看器条目。它隐藏了任何表明坠机曾经发生过的证据(这真的很可怕,IMO)。
问题
现在我来回答我的问题:此外,当我删除 SEM_NOGPFAULTERRORBOX 时,不会出现 Windows 错误报告对话框。我收到了崩溃报告,但对话窗口仍然被抑制。这是我想要的确切行为,所以,耶!,但我不明白。根据该 Microsoft 文档,删除该标志应该会导致 WER 对话框。为什么我没有收到 WER 对话框? Microsoft 是否明智地认识到纯命令行应用程序不应打开错误对话框(由于 SSH,通常甚至无法看到或关闭)。
其他 SO 答案提到将 HKLM\...\WER 键 DontShowUI 设置为 1 以抑制 WER 对话框,我准备在必要时这样做,但我还没有这样做.该键不存在,因此这不是 WER 对话框未出现的原因。
【问题讨论】:
标签: command-line crash-reports event-log crash-dumps windows-error-reporting