2013-10-07 48 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版本兼容。

相关问题