断言与 C/C++ 中的调试有啥关系? [关闭]

Posted

技术标签:

【中文标题】断言与 C/C++ 中的调试有啥关系? [关闭]【英文标题】:What does assert have to do with debugging in C/C++? [closed]断言与 C/C++ 中的调试有什么关系? [关闭] 【发布时间】:2021-12-25 13:54:31 【问题描述】:

试图找出 NDEBUG_DEBUG 在 Visual Studio 中的实际含义,我遇到了一个 cppreference page,它解释了 NDEBUG 是关于 assert 函数是否在代码中起作用。

调试与assert 函数有什么关系?在定义 assert 的行为方式时,为什么我们有名称 NDEBUG

更新 为了更准确地提出这个问题,我想知道一些实现细节。 assert 用于调试是什么?我们究竟要断言什么?为什么我们要避免这样的断言?

【问题讨论】:

提示:assert() 不是函数而是宏。现在尝试查找并阅读该宏的定义。另外,做一些研究:***.com/search?q=%5Bc%2B%2B%5D+what+is+assert! 相关:_DEBUG vs NDEBUG 相关:What is the NDEBUG preprocessor macro used for (on different platforms)? @WeatherVane 我也看到了,其实那个帖子让我更加困惑 断言失败表示存在错误。它是一种检测错误的工具。这就是它与调试的关系。 【参考方案1】:

在调试模式下,宏 NDEBUG 未定义。结果断言被检查。

来自 C 标准(7.2 诊断 )

1 头文件 定义了 assert 和 static_assert 宏 并引用另一个宏,

NDEBUG

不是由 定义的。如果 NDEBUG 被定义为宏 源文件中包含 的位置的名称, 断言宏被简单地定义为

#define assert(ignore) ((void)0)

根据NDEBUG的当前状态重新定义assert宏 每次包含 。

【讨论】:

好吧,我想知道assertions are checked在调试方面是什么意思 @Kaiyakha 你的问题没有意义。很明显,这意味着当宏 NDEBUG 没有定义时,所有的断言都会被检查。否则它们将被忽略。 @我更新了问题,希望这能解决问题 @Kaiyakha 我已经回答了你的问题。【参考方案2】:

我相信你混合了导致混乱的两件事。

当您听说调试时,您可能正在考虑使用断点等单步执行程序。Assert 和 NDEBUG(直接)与此没有任何关系。

另一个问题是程序是否使用调试配置编译。这意味着编译器没有或有限的优化、添加的调试符号、激活的断言以及可能更多的东西。为了在发布配置中禁用断言,定义了 NDEBUG,它会为失败的断言停用崩溃。

为了正确进行调试,您应该使用使用调试配置编译的应用程序版本。这通常也会导致失败的断言触发您的调试器。但是这样的版本还有其他用途。例如,您可以将其提供给测试人员,以便在发生意外情况时触发断言。

【讨论】:

以上是关于断言与 C/C++ 中的调试有啥关系? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 assert (断言)

使用 PInvoke 连接 C/C++ DLL 的调试断言失败

Visual Studio 调试断言失败 [关闭]

C/C++ 中的调试原则/核心主题 [关闭]

iOS - 断言处理与调试

与android线程相关的looper、handler等术语是啥?这些类有啥关系? [关闭]