command-line - Windows 错误报告是否会抑制命令行应用程序的错误对话框?
问题描述
背景
我有一个 C++ 命令行应用程序在 Windows 10 和 Windows Server 2016 上崩溃。这次崩溃的原因与这篇文章无关,实际上我已经修复了崩溃。在尝试解决此崩溃时,我使用此操作方法在 Windows 10 上启用崩溃报告转储。我编辑了注册表,并在HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
其中添加了以下键:
DumpFolder
:C:\data0\CrashReports
DumpCount
:0x10
DumpType
:0x2
我还确保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
密钥DontShowUI
以1
抑制 WER 对话框,我准备在必要时这样做,但我还没有这样做。该键不存在,因此这不是 WER 对话框未出现的原因。
解决方案
我过去曾对此进行过调查,得出的结论是 Windows 10 中 Windows 错误报告的行为发生了变化。在以前的 Windows 版本中,它看起来像是默认值DontShowUI
was 0
,而在 Windows 10 中,默认值已更改为1
,您需要将其显式设置为0
以再次启用错误对话框。
至少当崩溃发生在显示用户界面的进程中时。对于不可见的(包括控制台)进程,WER 会忽略 的值DontShowUI
并进行硬编码以从不显示错误对话框。
这最终导致我编写了一个工具,该工具将自身挂钩到 WER 并修改其行为以显示所有崩溃的对话框,包括那些在不可见进程中的崩溃:WerTweak。另外,它使 WER 显示与以前的 Windows 版本相同的旧式崩溃报告对话框,而不是通常在 Windows 10 中显示的残缺的新对话框。
推荐阅读
- react-native - DeepLinking react native 后返回组件
- laravel - Laravel CSS 问题的背包
- excel - excel vba - iterate through specific sheets in range
- .net-core - Azure Pipeline - dotnet 构建失败并显示“错误 MSB3073:命令 netcoreapp2.2/ThisAssembly.Project.g.cs' 退出,代码 2。”
- c++ - How to declare "using" for "std::array" using template
- php - Intellij 中 Vagrant VM 上的多个同时 Xdebug 连接
- python - CQL filter method - python
- spring - 重试下一个 Flux 元素并忽略成功的元素
- node.js - 将 Elastic Beanstalk 上的 Web 服务器与 MongoDB Atlas 上的数据库服务器连接时出错
- java - latest date form a list of string including month name