4

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

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

“调试模式”是什么意思 wrt C++ 程序?

当我们在其上使用 GDB 时,我们可以说程序处于调试模式吗?

4

3 回答 3

5

“调试模式”有三个方面。

许多库(包括标准库)在调试模式下编译时会插入调试帮助代码(数组边界检查、不变断言等)。他们在生产/非调试模式下删除这些检查以提高性能。

编译器有调试开关。库用于检测您是否为调试而编译的设置调试宏,并在生成的二进制文件中插入调试符号。这有助于调试器在正在运行的二进制代码和生成它的源代码之间建立链接。

在调试器中运行程序是一种“运行时调试模式”。您可以在调试器中运行可执行文件,无论它是否是为调试而构建的。您将通过调试构建获得更多信息。

这三种“调试模式”都是独立的。您可以(通常)通过手动设置适当的宏/定义来编译生产构建中的库调试检查,而无需要求编译器输出调试符号。

这些都不是特定于 C++(或 C)的。许多其他语言都有这些概念。

于 2012-05-08T08:19:54.997 回答
5

“调试模式”可以指很多东西,但在这种情况下,它指的是没有NDEBUG定义宏的编译。从您链接到的页面(强调我的):

DFATAL 严重性在调试模式下记录一个 FATAL 错误(即,没有定义 NDEBUG 宏),但通过自动将严重性降低为 ERROR 来避免在生产中停止程序。

于 2012-05-08T08:17:51.347 回答
4

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

规范的调试模式标志是宏NDEBUG,如果定义,则表示您处于调试模式。(它可以更清楚地命名PRODUCTION,但遗憾的是它是根据它不是什么来命名的。)

NDEBUG是标准的,也是古老的。它由头文件使用<cassert>,在 C 中被称为<assert.h>。它的官方功能是使assert宏成为空操作,但它通常也会影响 C++ 标准库在检查边界和要求方面。

例如,g++ -DNDEBUG myProg.cpp -o myProg应该在没有与调试相关的运行时特性的情况下进行编译。

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

于 2012-05-08T08:18:02.183 回答