2011-06-18 50 views
7

海合會(GCC)4.6.0 GNU GDB(GDB)的Fedora(7.2.90.20110525-38.fc15)調試符號的外觀如何?

我最近當我試圖用gdb調試我的問題一個問題。當我裝我的二進制gdb的抱怨「沒有調試符號被發現」

所以,當我做了以下內容:

nm ass1 

我得到了下面的輸出(只樣本)

00000000006026e0 t __init_array_end 
00000000006026d0 t __init_array_start 
00000000004020e0 T __libc_csu_fini 
0000000000402050 T __libc_csu_init 
       U [email protected]@GLIBC_2.2.5 
00000000006029ec A _edata 
0000000000602b28 A _end 
000000000040212c T _fini 
0000000000401420 T _init 
0000000000401610 T _start 
       U [email protected]@GLIBC_2.2.5 
000000000040163c t call_gmon_start 
0000000000602b10 b completed.5886 
00000000006029e8 W data_start 
0000000000602b18 b dtor_idx.5888 
00000000004016d0 t frame_dummy 
00000000004016f4 T main 

的問題是我忘了添加-g。所以我決定用-g編譯並再次運行nm。我有一個simliar輸出,這包含了調試符號爲我所用-g和gdb沒有抱怨這個時候:從二進制是個頭大

    U [email protected]@GLIBC_2.2.5 
00000000006029ec A _edata 
0000000000602b28 A _end 
000000000040212c T _fini 
0000000000401420 T _init 
0000000000401610 T _start 
       U [email protected]@GLIBC_2.2.5 
000000000040163c t call_gmon_start 
0000000000602b10 b completed.5886 
00000000006029e8 W data_start 
0000000000602b18 b dtor_idx.5888 
00000000004016d0 t frame_dummy 
00000000004016f4 T main 
       w pthread_cancel 

分開。我可以注意到使用nm的任何不同。我想知道我應該尋找什麼?調試符號是什麼樣的?

非常感謝您的任何建議,

回答

7

nm默認隱藏調試符號。使用-a選項來顯示它們。

現代系統通常不使用調試符號本身stabs調試格式是爲與a.out格式可執行文件一起使用而開發的,它只能表示有限的內部結構;這導致在符號表中隱藏了很多東西,比如調試符號和initializers/constructors。 COFF(現在大多是過時的)和ELF文件格式允許使用任意部分,並且大多數現代Linux發行版配置gcc以使用DWARF 2調試信息。您應該可以使用GNU objdump來檢查這些信息。

(我不會出現有機會獲得一臺機器,其binutils會產生stabs或GNU stabs+格式,所以我會推遲到Google的細節。)

+0

我已經做到了與使用-a這兩種情況都使用和不使用-g進行編譯。但是,我得到了很多符號,但哪些是調試符號?謝謝。 – ant2009

+0

列名註釋。你根本沒有任何符號; Linux通常使用DWARF 2調試信息,它存儲在不同的ELF段中,而不是符號表(後者是從有限的'a.out'格式中保留)。 – geekosaur