2010-02-11 37 views
7

我想知道是否可以得到gcc選項列表,這可能會導致gdb出現異常。使用GDB進行調試時可能導致麻煩的GCC選項

當然,我們都知道使用優化選項(例如-O3)會在gdb中造成奇怪的行爲,但其他的選擇會有什麼影響?

(我正在試圖運行在gdb的MPEG2解碼,我甚至清除的優化參數後得到怪異的行爲...)

+0

形容很奇怪。你添加了-ggdb嗎?最重要的是:寫出你仍然使用的選項。 – ebo 2010-02-11 17:23:15

+0

只使用了-g和-g3。在我的情況下,奇怪的行爲是這樣的:一個函數定義開始於第654行,'n'然後跳轉到第765行,另一個'n'跳回第654行等等4或5次,當然,行765不應該是下一個......但即使我現在正在尋找導致此問題的國旗,我對可能會更普遍地導致奇怪行爲的不同選項感到好奇。 – claf 2010-02-11 17:28:06

+0

對於我仍在使用的選項,有很多安靜的地方,我沒有將它們發佈在我的問題中,而是使其更一般化。 – claf 2010-02-11 17:35:07

回答

9

我認爲這是很難說你should't用什麼標誌調用時gcc進行調試。 gcc docs請注意,默認調試標誌爲-g-O2,並且使用-g -O0 -fno-inline可禁用任何優化和函數內聯。

在我看來,如果你真的想保證沒有什麼會攪亂你的調試過程,你只需要編譯-g -O0 -fno-inline標誌。

+0

如果您同時擁有-O3標誌,其他標誌和「-g -O0 -fno-inline」,會發生什麼情況? – user65636 2010-02-16 17:35:30

+0

我做了一個簡單的程序,並使用-O3 -g -O0 -fno-inline -S和我有相同的輸出-g -O0 -fno-inline -S。但使用-g -O0 -fno-inline -O3 -S時,輸出不同,在這種情況下,使用-O3的彙編代碼比使用-O3生成的代碼更大。我不知道這個結果的影響。 – coelhudo 2010-02-16 23:53:47

+2

毫不奇怪,-O0覆蓋了第一種情況下的-O3。 gcc手冊頁說:「如果使用多個-O選項,無論有沒有級別號碼,最後一個這樣的選項是有效的。」 – bug313 2013-11-21 15:56:27

0

GCC documentation說,你應該使用-oG:

-oG

優化調試經驗。 -Og支持不影響調試的優化。它應該是標準編輯 - 編譯 - 調試周期的優化級別選擇,提供合理的優化級別,同時保持快速編譯和良好的調試體驗。

它還介紹了每個optmization標誌及其如何影響調試。

+1

原則上是的,在實踐中'-O0'可能更可取 – 2015-12-01 18:13:09