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

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

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

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

【问题讨论】:

标签: c++ windows debugging memory build-automation


【解决方案1】:
  1. 按照 Gently 先生的建议,使用“禁用错误报告”。另见this PC World article
  2. 如果您的构建机器上碰巧有 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 可以。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 2011-07-27
        • 1970-01-01
        相关资源
        最近更新 更多