我正在尝试使用 GDB 调试一个简单的 C 项目,但是无论我如何编译它,GDB 似乎都找不到该程序的调试符号。
当我将程序加载到 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
当make调用gcc时,我可以看到正在使用它。但是,我尝试更改为 just -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 是“错误”版本?