当我想要调试 C 或 C++ 程序时,我被教导如何使用-O0关闭优化,并将-ggdb符号插入到可执行文件中,这些符号针对使用gdb我使用的 GNU 调试器进行了优化(或者,您可以-glldb使用LLVM/clang 的lldb调试器,或者只是-g用于一般调试符号,但这不会像-ggdb表面上那么好......)。然而,我最近偶然发现有人说使用-Og(而不是-O0),这让我措手不及。果然,它在man gcc!:
-Og优化调试体验。-Og启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。
那么,有什么区别呢?这是-O0来自的描述man gcc:
-O0减少编译时间并使调试产生预期结果。这是默认设置。
man gcc不过,明确表示-Og“应该是标准编辑-编译-调试周期选择的优化级别”。
这听起来像是-O0真正的“没有优化”,而-Og“进行了一些优化,但只是那些不干扰调试的优化”。它是否正确?那么,我应该使用哪个,为什么?
--copt=与 Bazel 一起使用的调试设置的回答:gdb:当前上下文中没有符号“i”