2013-10-07 79 views
10

我想使用GDB調試一個簡單的C項目,但GDB似乎無法找到該程序的調試符號,無論我如何編譯它。GDB說「沒有符號表」,但nm顯示文件有調試符號

當我加載該程序進入GDB,它聲稱已經成功地讀取符號,因爲它打印

Reading symbols from /home/edward/<executable>...done. 

然而,當我運行程序,打破分段錯誤,然後鍵入info locals,它說

No symbol table info available. 

此外,bt表明,執行的功能我寫的(不是系統或庫調用)內停止,但沒有行號信息,只是原始的內存地址。

爲什麼GDB無法找到或使用之前成功讀取的符號?我在運行的二進制文件上運行了nmobjdump,它們都顯示.debug_info.debug_line這樣的部分,因此該文件確實包含調試符號。

我通常與設置以下標誌一個Makefile編譯:

CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall 

,我可以看到正在使用時許調用gcc的。然而,我試過只更改爲-g,並通過在簡單的測試文件上調用gcc -g -O0來手動編譯,結果仍然相同:二進制文件包含調試符號,GDB讀取它們,但調用任何GDB命令結果調試信息不​​可用的消息。

更新

我運行Ubuntu 12.04,我GDB的版本是7.4,我的版本的GCC 4.8.1是。

如果我set complaints 10000在GDB,然後加載該文件,則它將下列投訴:

Reading symbols from /home/edward/<snip>/minithread... 
DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE at 0x205 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x4006c3 is not < DW_AT_high_pc 0xa9 for DIE at 0x235 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x40076c is not < DW_AT_high_pc 0xad for DIE at 0x287 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400819 is not < DW_AT_high_pc 0xe7 for DIE at 0x2d3 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400900 is not < DW_AT_high_pc 0x4f for DIE at 0x345 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x40094f is not < DW_AT_high_pc 0x55 for DIE at 0x39d [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x4009a4 is not < DW_AT_high_pc 0x38 for DIE at 0x3e7 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x4009dc is not < DW_AT_high_pc 0x43 for DIE at 0x433 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400a20 is not < DW_AT_high_pc 0x2e for DIE at 0x56c [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400a4e is not < DW_AT_high_pc 0x2e for DIE at 0x5aa [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400a7c is not < DW_AT_high_pc 0x29 for DIE at 0x5d4 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400aa5 is not < DW_AT_high_pc 0x49 for DIE at 0x620 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400aee is not < DW_AT_high_pc 0xca for DIE at 0x66c [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400bb8 is not < DW_AT_high_pc 0x7bb for DIE at 0x6f0 [in module /home/edward/<snip>/minithread]...done. 

這些錯誤的問題的原因是什麼?他們的意思是我的GDB是「錯誤的」版本嗎?

+0

'gcc -g'給你符號信息。毫無疑問。您可以發佈您的測試文件或我們可以編譯的測試文件的一部分。您是否嘗試過在p選項 – Gangadhar

+0

的幫助下打印任何符號。首先要運行普通的「gdb」,然後「設置投訴10000」,然後運行「file .../myexecutable」。如果在DWARF中發現奇怪的事情,這將使DWARF讀者抱怨。你也沒有提到你使用的是什麼版本的GCC或gdb。有時候更新的gcc需要更新的gdb。 –

+0

[Ubuntu上的C++應用程序可能重複。在安裝gcc 4.8.1之後,gdb不起作用](http://stackoverflow.com/questions/19129706/c-app-on-ubuntu-after-installing-gcc-4-8-1-the-gdb-does -not-work) –

回答

21

gcc 4.8.1生成gdb 7.4無法理解的dwarf4調試信息。您需要安裝gdb 7.6

+0

我得到了gdb 7.11,並且遇到了同樣的問題。 – Blauhirn

+0

與gcc 4.8.5和gdb有同樣的問題7.6.1 – Sergei

+0

與gcc 4.9.1和gdb 7.2-90.el6有同樣的問題 – firo

1

gdb讀取.debug_info部分之前.symtab .dynsym。

nm剛剛讀取.symtab .dynsym。

這是因爲ELF文件中的.debug_info部分已被分段。

您可以使用:

readelf -S youelf | grep -i debug 

檢查羯羊DEBUG_INFO存在。

10

除了Chris Dodd的回答,您還可以使用gcc -gdwarf-3編譯代碼,該代碼使用dwarf3調試信息進行編譯。這與您的GDB版本兼容。

相關問題