【发布时间】:2020-08-13 00:01:47
【问题描述】:
当我想调试 C 或 C++ 程序时,我被教导使用 -O0 关闭优化,并使用 -ggdb 将符号插入到针对使用 GNU gdb 而优化的可执行文件中我使用的调试器(或者,您可以将-glldb 用于LLVM/clang 的lldb 调试器,或者仅将-g 用于一般调试符号,但这显然不如-ggdb...) .然而,我最近偶然发现有人说要使用-Og(而不是-O0),这让我措手不及。果然,在man gcc!:
-Og优化调试体验。-Og启用不干扰调试的优化。它应该是标准编辑-编译-调试周期选择的优化级别, 提供合理的优化水平,同时保持快速编译和良好的调试体验。
那么,有什么区别呢?这是来自man gcc 的-O0 描述:
-O0减少编译时间,使调试产生预期的结果。这是默认设置。
man gcc 明确表示-Og“应该是标准编辑-编译-调试周期的优化级别”。
这听起来像是-O0 是真正的“没有优化”,而-Og 是“一些优化,但只有那些不干扰调试的优化”。它是否正确?那么,我应该使用哪个,为什么?
相关:
- 相关,但不重复! (仔细阅读,完全不是重复的):What is the difference between -O0 ,-O1 and -g
- 我在调试
--copt=设置以与 Bazel 一起使用时的回答:gdb: No symbol "i" in current context
【问题讨论】:
-
The manual 有更多详细信息:
Like -O0, -Og completely disables a number of optimization passes so that individual options controlling them have no effect. Otherwise -Og enables all -O1 optimization flags except for those that may interfere with debugging:。然后它会列出禁用的确切标志。 -
啊,这很有用!这比
man gcc提供的信息多! -
如果您仔细阅读问题中的摘录,我认为答案非常明确。
-Og优化了调试体验,而-O0最小化了编译速度。如果你想享受调试,你想使用-Og,如果你想快速找出该死的东西是否编译,你想使用-O0。 -
@AnttiHaapala,是的,但很高兴得到其他开发人员的确认,尤其是当我对新信息感到非常惊讶时(即:
-Og甚至存在)。
标签: c++ c debugging gdb compiler-optimization