我见过的大多数构建环境至少有两种策略:调试构建与最终/优化/发布构建。对于gcc来说,这通常意味着-g
对-O
的某些版本。现在,我看到了这样一种情况:优化的构建是用-O3
构建的,而调试版本是用-g3
和-O3
构建的。man gcc
确实表明这是可能的,但对于实际调试而言,这似乎与我的直觉相悖。
回顾http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html使我想起了-Og
,它允许不干扰调试的优化。这对我来说是有意义的,但是,除非您基本上尝试调试gcc自己的优化能力,否则用-O3 -g3
进行调试有什么令人信服的理由呢?
发布于 2013-08-01 17:08:53
有时候,人们会写不好的代码--例如,那些导致未定义行为的代码。现在,假设这种未定义的行为在低优化或不优化的情况下似乎“正确”工作,但是它会在-O3
造成灾难性的崩溃。您想在-O3
调试这个问题,对吗?因此,您别无选择,只能添加一个-g
标志并进城,即使调试经验可能会受到一些优化的影响。
一般来说,构建系统将“调试/发布”轴与“优化/未优化”轴混为一谈,存在一个大问题。实际上,它们应该是正交的--例如,通常希望有一个带有日志记录的“调试”构建,但仍然在启用优化的情况下快速运行。类似地,如果在优化的构建中没有可用的调试符号,可能很难跟踪与优化器相关的bug。
+--------------------------------+
| Optimizations |
+-----------------+--------------+
| On | Off |
+----------+------+-----------------+--------------+
| | On | Debug optimized | Best debug |
| Debug | | code | experience |
| Logging/ +------+-----------------+--------------+
| Symbols | Off | Release build | Probably not |
| | | for customers | useful |
+----------+------+-----------------+--------------+
https://stackoverflow.com/questions/18000214
复制相似问题