【问题标题】:What's the difference between a compiler's `-O0` option and `-Og` option?编译器的 `-O0` 选项和 `-Og` 选项有什么区别?
【发布时间】: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 是“一些优化,但只有那些不干扰调试的优化”。它是否正确?那么,我应该使用哪个,为什么?

相关:

  1. 相关,但不重复! (仔细阅读,完全不是重复的):What is the difference between -O0 ,-O1 and -g
  2. 我在调试 --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


【解决方案1】:

@kaylum 刚刚在我的问题下的评论中提供了一些深刻的见解!而我真正最关心的关键部分是:

[-Og] 是比 -O0 生成可调试代码更好的选择,因为在 -O0 处禁用了一些收集调试信息的编译器通道。

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

所以,从现在开始,除了-ggdb,我还使用-Og(不是-O0)。


UDPATE 2020 年 8 月 13 日:

见鬼!没关系。我坚持使用-O0

使用-Og 我得到<optimized out>Can't take address of "var" which isn't an lvalue. 错误到处都是!我不能再打印我的变量或检查它们的记忆了!例如:

(gdb) print &angle
Can't take address of "angle" which isn't an lvalue.
(gdb) print angle_fixed_p
$6 = <optimized out>

但是,使用-O0,一切正常!

(gdb) print angle
$7 = -1.34869879e+20
(gdb) print &angle
$8 = (float *) 0x7ffffffefbbc
(gdb) x angle
0x8000000000000000:     Cannot access memory at address 0x8000000000000000
(gdb) x &angle
0x7ffffffefbbc: 0xe0e9f642

所以,回到使用 -O0 而不是 -Og 吧!

相关:

  1. [他们还推荐-O0,我同意]What does <value optimized out> mean in gdb?

【讨论】:

  • 我也推荐-O0进行调试。使用-Og 断点往往会在错误的行触发。
猜你喜欢
  • 2011-07-01
  • 2011-06-01
  • 1970-01-01
  • 2013-07-24
  • 2022-08-23
  • 2013-03-11
  • 1970-01-01
  • 2014-09-20
  • 2017-06-24
相关资源
最近更新 更多