关于C++,什么是调试模式?

4

从这里开始:http://google-glog.googlecode.com/svn/trunk/doc/glog.html

调试模式支持
特殊的“调试模式”日志宏仅在调试模式下有效,并在非调试模式编译时被编译为无效代码。

关于 C++ 程序,“调试模式”指什么?

当我们在使用 GDB 调试程序时,能否说程序处于调试模式?


1
哪个编译器?使用g++,您可以在命令行上使用-g启用调试模式。然后当它运行时,它就处于调试模式下。虽然您可以使用未编译该开关的程序启动GDB,但我不认为您会将其称为“调试模式”。(而且您无法执行设置断点等操作。) - Mr Lister
1
你也想看这个问题:https://dev59.com/o3E95IYBdhLWcg3wft5w :) - LihO
3个回答

5
“调试模式”可以指很多东西,但在这种情况下,它指的是在未定义NDEBUG宏的情况下进行编译。从您提供的页面中(重点在于我):
DFATAL严重性会在调试模式下记录致命错误(即未定义NDEBUG宏),但通过自动将严重性降低为ERROR来避免在生产中停止程序。

5
“调试模式”有三个方面。
许多库(包括标准库)在编译调试模式下会插入一些帮助调试的代码(如数组边界检查,不变量断言等)。它们会在生产/非调试模式下移除这些检查以提高性能。
编译器具有调试开关。库使用设置调试宏来检测您是否在进行调试编译,并在生成的二进制文件中插入调试符号。这有助于调试器将正在运行的二进制代码与生成它的源代码联系起来。
在调试器中运行程序是“运行时调试模式”。无论是否为调试构建,都可以在调试器中运行可执行文件。使用调试构建可以获得更多信息。
所有这三个“调试模式”都是相互独立的。通常,您可以通过手动设置适当的宏/定义而不要求编译器输出调试符号来在生产构建中编译库调试检查。
这些内容并不特定于C++(或C)。许多其他语言也有这些概念。

4

C++程序(与C类似)通常基于预处理器宏具有不同的构建配置,这些宏可以从命令行传递。

规范的调试模式标志是宏NDEBUG,如果定义了该宏,则表示您处于调试模式。 (它可能更清晰地命名为PRODUCTION,但遗憾的是它是根据其非而命名的。)

NDEBUG是标准且古老的。 它由<cassert>头文件使用,该头文件在C中称为<assert.h>。 其官方功能是将assert宏变成无操作,但它还通常影响C ++标准库以检查边界和要求。

例如,g++ -DNDEBUG myProg.cpp -o myProg应该编译而不涉及与调试相关的运行时特性。

请注意,这与产生符号支持的调试器不同,后者由GCC上的-g或其他平台的其他标志控制。


请注意,在性能不是问题的环境中,即使在生产代码中也通常不定义NDEBUG - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接