使用gcc或Clang編譯C源代碼時,我始終使用-g
標誌爲gdb生成調試信息。GCC -g vs -g3 GDB標誌:有什麼區別?
gcc -g -o helloworld helloworld.c
我注意到,有人建議改爲-g3
。 -g
和-g3
標誌有什麼區別? -g
和-ggdb
之間的區別是什麼?
使用gcc或Clang編譯C源代碼時,我始終使用-g
標誌爲gdb生成調試信息。GCC -g vs -g3 GDB標誌:有什麼區別?
gcc -g -o helloworld helloworld.c
我注意到,有人建議改爲-g3
。 -g
和-g3
標誌有什麼區別? -g
和-ggdb
之間的區別是什麼?
從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時,一些調試器支持宏擴展。
可以解釋一下,例如「最具表現力的格式」和「額外信息」之間的區別是什麼?這些參數是否可以互補其中許多人提到GDB ......謝謝! – rogerdpack
TL;博士:爲了回答您的具體問題,-g3
「包括額外的信息,如宏定義一些調試器支持宏擴展當您使用-g3
。」,而-g
沒有。
更廣泛的答案是,gcc支持從-g0
(禁用調試信息)到-g3
(最大調試信息)的四個級別的調試信息。
指定-g
相當於-g2
。奇怪的是,gcc docs幾乎沒有說什麼信息-g
/-g2
包括或排除。
請求調試信息,並使用級別指定多少信息。默認級別爲2. 級別0根本不產生調試信息。因此,-g0否定-g。
1級會產生最少的信息,足以使您不打算調試的程序部分回溯。這包括函數和外部變量以及行號表的描述,但沒有關於局部變量的信息。
3級包含額外信息,如程序中存在的所有宏定義。有些調試器在使用-g3時支持宏擴展。
你想知道什麼不包含在文檔中? –
我來到這裏是因爲我在使用別人的makefile,而且文檔是一個從頭開始的野獸。在StackOverflow上找到一個簡單的答案,從谷歌的好問題。 – GreenAsJade