【问题标题】:How to turn off ASSERTs in debug mode in Visual Studio 2013如何在 Visual Studio 2013 中以调试模式关闭 ASSERT
【发布时间】:2015-03-18 10:42:19
【问题描述】:

有什么方法可以关闭断言而不是切换到发布模式。我需要调试一个经常做出断言的代码,这会减慢我的工作速度。 这些断言与我要解决的问题无关,所以现在它们只会减慢我的进度,因为它们在我的一个基类中经常被调用。 现在我没有时间改进他们的设计,所以有人可以告诉我是否有办法在调试模式下关闭断言并使用它的功能。

【问题讨论】:

    标签: c++ mfc assert


    【解决方案1】:

    您可以添加编译器标志/DNDEBUG 来关闭断言。我觉得这样更简洁,因为您不必更改代码中的任何内容。

    来自MSVC documentations

    您可以使用 /DNDEBUG 命令行选项关闭断言宏,而无需修改源文件。

    【讨论】:

      【解决方案2】:

      我没有 Visual Studio 2013,但以下内容在 Visual Studio 2015 中适用于我,因此对于 VS 2013 来说可能相同或类似。

      在你的 main() 函数中,调用

      _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
      

      在 Visual Studio 中,转到调试/Windows/异常设置。在异常设置中,转到 Win32 异常/0xc0000420 断言失败。取消选中该条目前面的框。

      我需要以上两个来抑制调试模式下的断言弹出窗口。

      【讨论】:

        【解决方案3】:

        您可以使用_set_error_mode_CrtSetReportMode(请参阅xMRi 的答案)来更改故障报告方法并避免出现模式对话框。参见那里的代码 sn-p:

        int main()
        {
           _set_error_mode(_OUT_TO_STDERR);
           assert(2+2==5);
        }
        

        另请注意,断言失败通常是有原因的,您希望修复代码,而不仅仅是禁止报告。将它们从调试版本中完全删除,您只是破坏了为您构建的好东西。

        【讨论】:

        • 似乎没有帮助 - 我仍然看到模态对话框,如:调试断言失败!文件:minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp 行:996 表达式:__acrt_first_block == header
        【解决方案4】:

        用户_CrtSetReportMode

        int iPrev = _CrtSetReportMode(_CRT_ASSERT,0);
        // Start Operation with no ASSERTs
        ...
        // Restore previous mode with ASSERTs
        _CrtSetReportMode(_CRT_ASSERT,iPrev);
        

        您可以只使用 _CRTDBG_MODE_DEBUG 而不是使用 0。

        【讨论】:

        • 似乎没有帮助 - 我仍然看到模态对话框,如:调试断言失败!文件:minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp 行:996 表达式:__acrt_first_block == header
        • 这是一个堆错误。他们总是出现。您的代码中有一个致命错误会破坏堆!你永远不应该忽视这样的错误!
        【解决方案5】:

        #define NDEBUG#include <assert.h> 之前禁用assert 宏。

        您可以将其添加到项目设置中的预处理器定义中。

        【讨论】:

        • 有用的信息,但是 MFC ASSERT 与标准库 assert 不同,并且控制方式不同。
        猜你喜欢
        • 1970-01-01
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        相关资源
        最近更新 更多