【问题标题】:What is a debug mode w.r.t C++?什么是调试模式 w.r.t C++?
【发布时间】:2012-05-08 08:13:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 哪个编译器?使用 g++,您可以通过在命令行上使用 -g 来启用调试模式。然后当它运行时,它处于调试模式。虽然您可以使用未使用开关编译的程序启动 GDB,但我不相信您将其称为“调试模式”。 (而且你不能做诸如设置断点之类的事情。)

标签: c++ debugging


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 请注意,在性能不是问题的环境中,即使在生产代码中也通常不定义NDEBUG
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2021-12-03
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多