【问题标题】:Stop MSVC++ debug errors from blocking the current process?阻止 MSVC++ 调试错误阻止当前进程?
【发布时间】:2008-10-02 17:11:28
【问题描述】:

Windows 上任何失败的 ASSERT 语句都会导致出现以下调试消息并冻结应用程序执行。我意识到这是预期的行为,但它会在无头机器上定期运行,因此可以防止单元测试失败,而是无限期地等待用户输入。

是否有一个注册表项或编译器标志可以用来阻止此消息框请求用户输入,同时仍然允许测试在 ASSERT 下失败?

基本上,我想在不修改任何代码的情况下执行此操作,只需更改编译器或 Windows 选项。

谢谢!

Microsoft Visual C++ Debug Library ASSERT http://img519.imageshack.us/img519/853/snapshotbu1.png

【问题讨论】:

    标签: windows unit-testing visual-c++ continuous-integration automated-tests


    【解决方案1】:

    我认为这是 _CrtDbgReport 为 _CRT_ASSERT 类型的报告显示的对话框。使用 _CrtSetReportHook,您可以为整个应用程序定制该行为。 (即需要一个本地更改)特别是,您可以在断言失败后继续执行,从而忽略它。

    【讨论】:

      【解决方案2】:

      来自 MSDN 关于 ASSERT 宏:

      在 MFC ISAPI 应用程序中,调试模式下的断言会弹出一个模态对话框(ASSERT 对话框现在默认是模态的);这将中断或挂起执行。要抑制模式断言对话框,请将以下行添加到您的项目源文件 (projectname.cpp):

      // For custom assert and trace handling with WebDbg
      #ifdef _DEBUG
      CDebugReportHook g_ReportHook;
      #endif
      

      完成此操作后,您可以使用 WebDbg 工具 (WebDbg.exe) 查看断言。

      【讨论】:

        【解决方案3】:

        在单元测试上下文中,将 ASSERT(实际上是 _CrtDbgReport 调用)转换为一些异常通常是好的,通常是 std::exception,其中包含一些信息性文本。 这往往会以失败的形式出现在单元测试的输出日志中。 这正是您想要的:失败的 ASSERT 应该是失败的单元测试。

        通过添加您的报告挂钩函数来做到这一点,指定使用:_CrtSetReportHook()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-15
          • 2011-10-13
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          相关资源
          最近更新 更多