什么是调试模式w.r.t C ++?

时间:2012-05-08 08:13:12

标签: c++ debugging

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

  

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

“调试模式”对w.r.t C ++程序意味着什么?

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

3 个答案:

答案 0 :(得分:5)

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

  

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

答案 1 :(得分:5)

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

一个很多库(包括标准库)的将插入时,他们在调试模式下被编译调试帮助代码(数组边界检查,不变的断言,诸如此类的东西)。他们在生产/非调试模式下删除这些检查以帮助提高性能。

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

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

所有这三种“调试模式”都是独立的。您可以(通常)在生产版本中编译库调试检查,方法是手动设置相应的宏/定义,而不要求编译器输出调试符号。

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

答案 2 :(得分:4)

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

规范调试模式标志是宏NDEBUG,如果定义则意味着您在调试模式下。 (它可以更明确地命名为PRODUCTION,但遗憾的是它的名称来自于它不是。)

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

例如,g++ -DNDEBUG myProg.cpp -o myProg应编译时没有与调试相关的运行时功能。

请注意,这与为调试器提供符号支持不同,后者在GCC上使用-g控制,或者在其他平台上使用其他标志。