在默認情況下,gcc在編譯時不會把調試符號插入到最終生成的二進制代碼(機器代碼)中,因為這樣會急劇增加可執行程序的大小。如果需要在編譯時生成調試符號的信息,則可以采用-g或-ggdb參數。
gcc在產生調試信息時,同樣采用了分級的思路(-g1,-g2,-g3),默認的級別是-g2,此時產生的調試信息包括擴展的符號表、行號、局部或外部變量信息。級別-g3包含級別-g2的信息,另外還有源代碼中定義的宏。級別-g1不包含局部變量和與行號有關的調試信息,只能用來回溯跟蹤和堆棧轉儲。回溯跟蹤指的是監視程序在運行過程中的函數調用歷史;堆棧轉儲則是一種以原始的十六進制格式保存程序執行環境的方法,兩者都是經常用到的調試手段。
gcc產生的調試符號具有普遍的適應性,可以被許多調試器加以利用,但如果使用的是gdb調試器,還可以通過-ggdb參數來向最終的二進制代碼中增加gdb專用的調試信息,從而可以方便gdb調試器的工作,但缺點是可能會引起其它調試器無法工作。-ggdb能夠接受的調試級別與-g是一樣的,它們對輸出的調試符號具有相同的影響。
注意:任何一個調試選項都會使最終生成的二進制代碼文件的體積急劇增大,同時增加程序在執行時的開銷,因此調試選項通常僅在軟件的開發和調試階段中使用,最終的產品中不包括調試信息。
[root@localhost work]# gcc -o hello hello.c
[root@localhost work]# ls -l hello
-rwxr-xr-x. 1 root root 8511 Oct 14 08:10 hello //8511 Byte(字節)
[root@localhost work]# gcc -o hello1 -g hello.c
[root@localhost work]# ls -l hello1
-rwxr-xr-x. 1 root root 9503 Oct 14 08:11 hello1? //9503 Byte(字節)
[root@localhost work]# gcc -o hello2 -g3 hello.c
[root@localhost work]# ls -l hello2
-rwxr-xr-x. 1 root root 28919 Oct 14 08:12 hello2??? //28919 Byte(字節)