可以禁用“应用程序错误”对话框吗?
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,还有两组值。通常注册表位置中的那些和HKLM
中Wow6432Node
键下的那些。要同时更新两者,请从 %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 测试禁用一个对话框吗