C 广发银行说:";“无符号表”;但nm显示文件有调试符号

C 广发银行说:";“无符号表”;但nm显示文件有调试符号,c,debugging,gcc,gdb,C,Debugging,Gcc,Gdb,我正在尝试使用GDB调试一个简单的C项目,但是GDB似乎无法找到程序的调试符号,无论我如何编译它 当我将程序加载到GDB中时,它声称已经成功读取了符号,因为它打印了 Reading symbols from /home/edward/<executable>...done. 另外,bt显示在我编写的函数中停止执行(不是系统或库调用),但没有行号信息,只有原始内存地址 为什么GDB不能找到或使用它先前成功读取的符号?我在正在运行的二进制文件上运行了nm和objdump,它们都显示了.

我正在尝试使用GDB调试一个简单的C项目,但是GDB似乎无法找到程序的调试符号,无论我如何编译它

当我将程序加载到GDB中时,它声称已经成功读取了符号,因为它打印了

Reading symbols from /home/edward/<executable>...done.
另外,
bt
显示在我编写的函数中停止执行(不是系统或库调用),但没有行号信息,只有原始内存地址

为什么GDB不能找到或使用它先前成功读取的符号?我在正在运行的二进制文件上运行了
nm
objdump
,它们都显示了
.debug\u info
.debug\u line
,因此该文件实际上包含调试符号

我通常使用设置以下标志的Makefile进行编译:

CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall
我可以看到make调用gcc时正在使用它。但是,我尝试更改为只使用
-g
,并通过在一个简单的测试文件上调用
gcc-g-O0
手动编译,结果仍然是一样的:二进制文件包含调试符号,GDB读取它们,但调用任何GDB命令都会导致一条消息,即调试信息不可用

更新

我正在运行Ubuntu12.04,我的GDB版本是7.4,我的GCC版本是4.8.1

如果我在GDB中
设置投诉10000
,然后加载文件,它将打印以下投诉:

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.
从/home/edward//迷你线程读取符号。。。
对于0x205处的管芯,处于低电平的DW_pc 0x400690不是

这些错误是问题的原因吗?他们是说我的GDB版本“错误”了吗?

GCC4.8.1生成了GDB7.4无法理解的dwarf4调试信息。您需要在.symtab.dynsym之前安装gdb 7.6

gdb read.debug_info部分

nm刚刚读取.symtab.dynsym

这是因为ELF文件中的.debug_info部分已分条

您可以使用:

readelf -S youelf | grep -i debug

检查是否存在调试信息。

除了Chris Dodd的答案外,您还可以使用
gcc-gdwarf-3
编译代码,后者使用dwarf3调试信息编译。它与您的GDB版本兼容。

gcc-g
为您提供符号信息。毫无疑问。您可以发布您的测试文件或我们可以编译的部分测试文件吗。您是否尝试过在p选项的帮助下打印任何符号?一个开始的地方是运行普通的“gdb”,然后是“set 10000”,然后是“file…/myexecutable”。如果矮人读者发现矮人身上有奇怪的东西,就会抱怨。另外,您没有提到您正在使用的GCC或gdb的版本。有时较新的gcc需要较新的gdb。可能重复的可能重复的可能重复的我得到了gdb 7.11并努力解决相同的问题。gcc 4.8.5和gdb 7.6.1有相同的问题gcc 4.9.1和gdb 7.2-90.el6这是更好的,因为不能总是升级gdb版本谢谢你。从-ggdb切换到-gdwarf-3在我的环境中起到了作用:GBD7.4-2012.04和GCC4.9.4
readelf -S youelf | grep -i debug