GDB 说“没有符号表",但 nm 显示文件有调试符号 [英] GDB says "no symbol table," but nm shows file has debug symbols

查看:11
本文介绍了GDB 说“没有符号表",但 nm 显示文件有调试符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to debug a simple C project using GDB, but GDB can't seem to find the debug symbols for the program no matter how I compile it.

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

When I load the program into GDB, it claims to have read the symbols successfully because it prints

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

但是,当我运行程序时,由于分段错误而中断,然后键入 info locals,它说

However, when I run the program, break on a segmentation fault, and type info locals, it says

No symbol table info available.

另外,bt 显示执行在我编写的函数内部停止(不是系统或库调用),但没有行号信息,只有原始内存地址.

Also, bt shows that execution stopped inside a function I wrote (not a system or library call), but there is no line number information, just raw memory addresses.

为什么 GDB 不能找到或使用它之前成功读取的符号?我在正在运行的二进制文件上运行了 nmobjdump,它们都显示了像 .debug_info 这样的部分.debug_line,因此该文件实际上包含调试符号.

Why can't GDB find or use the symbols it successfully read earlier? I've run nm and objdump on the binary file I'm running, and they both show sections like .debug_info, .debug_line, so the file does in fact contain debugging symbols.

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

I usually compile with a Makefile that sets the following flags:

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

当 make 调用 gcc 时,我可以看到正在使用它.但是,我尝试更改为仅 -g,并通过在一个简单的测试文件上调用 gcc -g -O0 手动编译,结果仍然相同:二进制文件包含调试符号,GDB 会读取它们,但调用任何 GDB 命令都会导致调试信息不​​可用的消息.

which I can see are being used when make invokes gcc. However, I've tried changing to just -g, and compiling manually by invoking gcc -g -O0 on a simple test file, and the result is still the same: the binary file contains debug symbols, and GDB reads them, but invoking any GDB command results in a message that debug information is not available.

更新

我运行的是 Ubuntu 12.04,我的 GDB 版本是 7.4,我的 GCC 版本是 4.8.1.

I'm running Ubuntu 12.04, my GDB version is 7.4, and my GCC version is 4.8.1.

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

If I set complaints 10000 in GDB and then load the file, it prints the following complaints:

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 是错误"版本?

Are these errors the cause of the problem? Do they mean my GDB is the "wrong" version?

推荐答案

gcc 4.8.1 生成 gdb 7.4 无法理解的 dwarf4 调试信息.您需要安装 gdb 7.6

gcc 4.8.1 generates dwarf4 debug info which gdb 7.4 can't understand. You need to install gdb 7.6

这篇关于GDB 说“没有符号表",但 nm 显示文件有调试符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆