2012-05-06 69 views
58

使用gcc或Clang編譯C源代碼時,我始終使用-g標誌爲gdb生成調試信息。GCC -g vs -g3 GDB標誌:有什麼區別?

gcc -g -o helloworld helloworld.c

我注意到,有人建議改爲-g3-g-g3標誌有什麼區別? -g-ggdb之間的區別是什麼?

+7

你想知道什麼不包含在文檔中? –

+7

我來到這裏是因爲我在使用別人的makefile,而且文檔是一個從頭開始的野獸。在StackOverflow上找到一個簡單的答案,從谷歌的好問題。 – GreenAsJade

回答

64

docs:在操作系統的本機格式

-g

產生調試信息(刺,COFF,XCOFF,或DWARF 2)。 GDB可以使用這個 調試信息。在大多數使用stabs格式的系統上,-g 允許使用只有GDB可以使用的額外調試信息;這個額外的信息使得GDB中的調試工作變得更好,但是可能的 會使其他調試器崩潰或拒絕讀取程序。如果您希望 控制是否生成額外信息,請使用 -gstabs +,-gstabs,-gxcoff +,-gxcoff或-gvms(請參見下文)。

...


-ggdb

產生調試通過GDB使用的信息。這意味着要使用可用的最具表現力的格式(DWARF 2,stabs或原生 格式(如果這兩種格式均不受支持)),包括GDB擴展(如果有可能,則爲 )。


-gvmslevel

請求調試信息,還可以使用級指定多少信息。默認級別爲2.級別0完全不產生 調試信息。因此,-g0否定-g。

....

3級包括額外的信息,如所有的宏定義在程序 本。當你使用-g3時,一些調試器支持宏擴展。

+5

可以解釋一下,例如「最具表現力的格式」和「額外信息」之間的區別是什麼?這些參數是否可以互補其中許多人提到GDB ......謝謝! – rogerdpack

8

TL;博士:爲了回答您的具體問題,-g3「包括額外的信息,如宏定義一些調試器支持宏擴展當您使用-g3。」,而-g沒有。

更廣泛的答案是,gcc支持從-g0(禁用調試信息)到-g3(最大調試信息)的四個級別的調試信息。

指定-g相當於-g2。奇怪的是,gcc docs幾乎沒有說什麼信息-g/-g2包括或排除。

請求調試信息,並使用級別指定多少信息。默認級別爲2. 級別0根本不產生調試信息。因此,-g0否定-g。

1級會產生最少的信息,足以使您不打算調試的程序部分回溯。這包括函數和外部變量以及行號表的描述,但沒有關於局部變量的信息。

3級包含額外信息,如程序中存在的所有宏定義。有些調試器在使用-g3時支持宏擴展。