可以禁用“应用程序错误”对话框吗?

Posted

技术标签:

【中文标题】可以禁用“应用程序错误”对话框吗?【英文标题】:Can the "Application Error" dialog box be disabled? 【发布时间】:2010-10-18 14:56:15 【问题描述】:

我使用 Hudson 作为持续集成服务器来测试 C/C++ 代码。不幸的是,我在某处有一个导致内存损坏的错误,因此在某些 Windows 机器上,我有时会收到一个“应用程序错误”对话框,说明一条指令引用了无法读取的内存。弹出此对话框,基本上挂起测试运行,因为它需要手动干预。

有没有办法阻止此对话框出现,从而使测试运行简单地失败并在 Hudson 中报告为这样?

是否可以自动生成 minidump 而不是显示对话框?

【问题讨论】:

类似:***.com/questions/2284138/… 和 ***.com/questions/3561545/… 【参考方案1】:
    按照 Gently 先生的建议,使用“禁用错误报告”。另见this PC World article。 如果您的构建机器上碰巧有 MS Visual Studio,它将捕获应用程序错误并弹出一个对话框。要禁用这些对话框(以及 Visual Studio 的即时调试功能),请运行命令 drwtsn32.exe -i 将 Dr. Watson 设置为默认系统调试器。 Watson 博士将生成核心转储并静默退出。 (请参阅此 Microsoft 知识库文章:http://support.microsoft.com/kb/q121434/。)

【讨论】:

谢谢!恢复 Dr. Watson 配置并将其设置为不提示正是我想要的! PC World 文章似乎是空的。因此,第一个替代方案没有提供任何有用的答案。【参考方案2】:

您也可以使用 SetErrorMode 以编程方式执行类似的操作。有关详细信息,请参阅this 文章。

如何使用它的一个简单示例是执行以下操作:

SetErrorMode(GetErrorMode () | SEM_NOGPFAULTERRORBOX);

上面的“或”是当前模式与我们想要的添加。

【讨论】:

在类似的情况下,我认为调用“_set_abort_behavior(0, _WRITE_ABORT_MSG);”很重要,以防将来您的应用程序失败,因为有人调用“abort()”(未捕获的默认行为Debug 构建 IIRC 中的 C++ 异常)。【参考方案3】:

除了 rkb 说的,如果你运行的是 64 位的 Windows XP,还有两组值。通常注册表位置中的那些和HKLMWow6432Node 键下的那些。要同时更新两者,请从 %SYSTEMROOT%\system32%SYSTEMROOT%\SysWOW64 运行 drwtsn32.exe -i

【讨论】:

【参考方案4】:

通过以下方式禁用错误报告:

注册表编辑 -- 将您的应用程序添加到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PCHealth\ErrorReporting\ExclusionList,或者 右键单击“我的电脑”,转到“高级”选项卡,然后选择“禁用错误报告”选项,或者 您可以导航到管理工具中的服务控制台,找到错误报告服务,进入属性并禁用它

【讨论】:

【参考方案5】:

您可以使用各种 _CrtSetReport 函数来控制 C/C++ 运行时响应各种错误的方式(_CrtSetReportHook、_CrtSetReportMode、_CrtSetReportFile、_CrtSetReportHook2)

【讨论】:

【参考方案6】:

使用 try/catch 语句来捕获异常并按照您想要的方式处理它。

【讨论】:

据我所知,Try/catch 无法捕获无效的内存访问。 __try / __except 可以。

以上是关于可以禁用“应用程序错误”对话框吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 aws 设备场中为 Android espresso 测试禁用一个对话框吗

如何禁用对话框“切换到”-“重试”-“取消”

可以使用 Javascript 打开 PDF 文件的打印对话框吗?

CKEditor禁用链接双击对话框出现

禁用 supersu 权限对话框

注册表怎么禁用powershell