首页 > 解决方案 > Windows 错误报告是否会抑制命令行应用程序的错误对话框?

问题描述

背景

我有一个 C++ 命令行应用程序在 Windows 10 和 Windows Server 2016 上崩溃。这次崩溃的原因与这篇文章无关,实际上我已经修复了崩溃。在尝试解决此崩溃时,我使用此操作方法在 Windows 10 上启用崩溃报告转储。我编辑了注册表,并在HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps其中添加了以下键:

我还确保C:\data0\CrashReports每个人都可以读写。重新启动机器后,我运行我的应用程序再次崩溃,但没有转储崩溃报告。经过广泛的搜索和调试后,我发现了这个相关的 Stackoverflow 答案,在那里我了解到这SetErrorMode( SEM_NOGPFAULTERRORBOX )将防止将崩溃报告给 Windows 错误报告。事实上,我的应用程序有这个调用来抑制对话框:

SetErrorMode(
  SEM_FAILCRITICALERRORS |
  SEM_NOALIGNMENTFAULTEXCEPT |
  SEM_NOGPFAULTERRORBOX |
  SEM_NOOPENFILEERRORBOX )

文档SetErrorMode没有提到这一点。在这面旗帜中,它只说:

系统不显示 Windows 错误报告对话框。

尽管如此,SO 的答案似乎是正确的,因为当我SEM_NOGPFAULTERRORBOX从该调用中删除并保留其他三个标志时,我得到了我需要调试和修复我的崩溃的崩溃报告。事实上,我的崩溃也开始出现在事件查看器中。因此,显然,SEM_NOGPFAULTERRORBOX只是抑制 WER 对话框;它还禁止崩溃报告转储和事件查看器条目它压制了任何关于坠机曾经发生过的证据(这真的很可怕,IMO)。

问题

现在我来回答我的问题:此外,当我删除 时SEM_NOGPFAULTERRORBOX,不会出现 Windows 错误报告对话框。我收到了崩溃报告,但对话窗口仍然被抑制。这是我想要的确切行为,所以,耶!,但我不明白。根据该 Microsoft 文档,删除该标志应该会导致 WER 对话框。为什么我没有收到 WER 对话框?Microsoft 是否明智地认识到纯命令行应用程序不应打开错误对话框(由于 SSH,通常甚至无法看到或关闭)。

另一个 SO 答案提到设置HKLM\...\WER密钥DontShowUI1抑制 WER 对话框,我准备在必要时这样做,但我还没有这样做。该键不存在,因此这不是 WER 对话框未出现的原因。

标签: command-linecrash-reportsevent-logcrash-dumpswindows-error-reporting

解决方案


我过去曾对此进行过调查,得出的结论是 Windows 10 中 Windows 错误报告的行为发生了变化。在以前的 Windows 版本中,它看起来像是默认值DontShowUIwas 0,而在 Windows 10 中,默认值已更改为1,您需要将其显式设置为0以再次启用错误对话框。

至少当崩溃发生在显示用户界面的进程中时。对于不可见的(包括控制台)进程,WER 会忽略 的值DontShowUI并进行硬编码以从不显示错误对话框。

这最终导致我编写了一个工具,该工具将自身挂钩到 WER 并修改其行为以显示所有崩溃的对话框,包括那些在不可见进程中的崩溃:WerTweak。另外,它使 WER 显示与以前的 Windows 版本相同的旧式崩溃报告对话框,而不是通常在 Windows 10 中显示的残缺的新对话框。


推荐阅读