[英]What's the difference between a compiler's `-O0` option and `-Og` option?
當我想調試 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
是“進行了一些優化,但只是那些不干擾調試的”。 這樣對嗎? 那么,我應該使用哪個,為什么?
--copt=
settings to use with Bazel: gdb: No symbol "i" in current context@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.
到處都是錯誤:我無法打印我的變量或檢查他們的 memory 了! 前任:
(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
它是!
-O0
,我同意] gdb 中的 <value optimization out> 是什么意思? 由於編輯,加布里埃爾上面的優秀回答並不完全清楚-ggdb
的添加。 我發現如果 GDB 是您首選的調試器,那么與-O0
一起使用絕對有利的是始終還使用-ggdb3
( 3
很重要,比僅僅ggdb
更好)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.