我想使用GDB調試一個簡單的C項目,但GDB似乎無法找到該程序的調試符號,無論我如何編譯它。GDB說「沒有符號表」,但nm顯示文件有調試符號
當我加載該程序進入GDB,它聲稱已經成功地讀取符號,因爲它打印
Reading symbols from /home/edward/<executable>...done.
然而,當我運行程序,打破分段錯誤,然後鍵入info locals
,它說
No symbol table info available.
此外,bt
表明,執行的功能我寫的(不是系統或庫調用)內停止,但沒有行號信息,只是原始的內存地址。
爲什麼GDB無法找到或使用之前成功讀取的符號?我在運行的二進制文件上運行了nm
和objdump
,它們都顯示.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是「錯誤的」版本嗎?
'gcc -g'給你符號信息。毫無疑問。您可以發佈您的測試文件或我們可以編譯的測試文件的一部分。您是否嘗試過在p選項 – Gangadhar
的幫助下打印任何符號。首先要運行普通的「gdb」,然後「設置投訴10000」,然後運行「file .../myexecutable」。如果在DWARF中發現奇怪的事情,這將使DWARF讀者抱怨。你也沒有提到你使用的是什麼版本的GCC或gdb。有時候更新的gcc需要更新的gdb。 –
[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) –