【问题标题】:Does Windows Error Reporting suppress error dialogs for command-line applications?Windows 错误报告是否会抑制命令行应用程序的错误对话框?
【发布时间】: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\...\WERDontShowUI 设置为 1 以抑制 WER 对话框,我准备在必要时这样做,但我还没有这样做.该键不存在,因此这不是 WER 对话框未出现的原因。

【问题讨论】:

    标签: command-line crash-reports event-log crash-dumps windows-error-reporting


    【解决方案1】:

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

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

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

    【讨论】:

    • 这也是我开始得出的结论——从 Windows 10 开始,不可见的进程不会打开错误对话框。这是一个关键的改进,IMO,所以我很高兴。几天后我会回过头来接受这个答案,让这个活动有一些时间可能会吸引其他答案。
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2012-10-21
    • 2010-09-19
    • 2011-08-21
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多