簡體   English   中英

編譯器的“-O0”選項和“-Og”選項有什么區別?

[英]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是“進行了一些優化,但只是那些不干擾調試的”。 這樣對嗎? 那么,我應該使用哪個,為什么?

有關的:

  1. 相關,但不是重復,(仔細閱讀:它根本不是重復): -O0、-O1 和 -g 之間有什么區別
  2. 我對調試的回答--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它是!

有關的:

  1. [他們還推薦-O0 ,我同意] gdb 中的 <value optimization out> 是什么意思?

由於編輯,加布里埃爾上面的優秀回答並不完全清楚-ggdb的添加。 我發現如果 GDB 是您首選的調試器,那么與-O0一起使用絕對有利的是始終還使用-ggdb33很重要,比僅僅ggdb更好)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM