使用-g3和-O3进行编译

pat*_*cek 3 compiler-construction debugging optimization gcc build

我见过的大多数构建环境至少有两个策略:调试构建与最终/优化/发布构建.与海湾合作委员会,这通常意味着一些版本-gVS -O.现在我看到的情况是构建优化的构建,-O3而调试版本是用-g3 构建的-O3.man gcc确实表明这是可能的,但这对我来说似乎违反了实际的调试目的.

回顾http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html提醒我-Og,它允许不干扰调试的优化.这对我来说很有意义,但-O3 -g3除非你基本上试图调试gcc自己的优化能力,否则有什么令人信服的理由可以进行调试?

Car*_*rum 8

例如,有时候人们编写错误的代码 - 可能是导致未定义行为的代码.现在让我们说,在低优化或无优化的情况下,未定义的行为似乎"正确"工作,但它会导致灾难性的崩溃-O3.您将要调试此问题-O3,对吧?那么你就别无选择,只能添加一个-g标志并进入城镇,即使调试经验可能会受到优化的影响.

一般来说,构建系统将"调试/释放"轴与"优化/未优化"轴相混合存在一个大问题.实际上,它们应该是正交的 - 例如,通常需要使用日志记录进行"调试"构建,但仍然可以在启用优化的情况下快速运行.同样,在优化构建中没有可用的调试符号的情况下,跟踪与优化器相关的错误可能非常困难.

                  +--------------------------------+
                  |           Optimizations        |
                  +-----------------+--------------+
                  |        On       |     Off      |
 +---------+------+-----------------+--------------+
 |         |  On  | Debug optimized |  Best debug  |
 |  Debug  |      |    code         |  experience  |
 | Symbols +------+-----------------+--------------+
 |         |  Off |   Release build | Probably not |
 |         |      |  for customers  |    useful    |
 +---------+------+-----------------+--------------+
Run Code Online (Sandbox Code Playgroud)