使用gdb时找不到调试符号

时间:2011-03-09 10:36:21

标签: c++ gdb

GNU gdb Fedora(6.8-37.el5)     Kernal 2.6.18-164.el5

我正在尝试调试我的应用程序。但是,每次我将二进制文件传递给gdb时都会说:

(no debugging symbols found)

这是二进制文件的文件输出,如你所见,它没有被剥离:

vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

我正在使用以下CFLAGS进行编译:

CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code

有人可以告诉我,如果我在这里错过了一些简单的话吗?

8 个答案:

答案 0 :(得分:43)

当出现-g时,“找不到调试符号”的最常见原因是链接线上某处存在“迷路”-s-S参数。

来自man ld

   -s
   --strip-all
       Omit all symbol information from the output file.

   -S
   --strip-debug
       Omit debugger symbol information (but not all symbols) from the output file.

答案 1 :(得分:26)

应用程序必须编译并与-g选项链接。即你需要将-g放在CPPFLAGS和LDFLAGS中。

答案 2 :(得分:16)

某些Linux发行版不使用gdb样式的调试符号。 (IIRC他们更喜欢dwarf2。)

通常,gccgdb将同步它们使用的调试符号类型,强制使用特定样式只会导致问题;除非您知道自己需要其他内容,否则请使用-g

答案 3 :(得分:4)

如果你正在为Android编译,你也应该尝试-ggdb而不是-g!

答案 4 :(得分:3)

将-ggdb替换为-g,并确保不使用strip命令剥离二进制文件。

答案 5 :(得分:3)

我知道很久以前就回答了这个问题,但我最近花了好几个小时试图解决类似的问题。设置是运行Debian 8的本地PC,使用Eclipse CDT Neon.2,远程ARM7板(Olimex)运行Debian 7.工具链是Linaro 4.9,使用远程板上的gdbserver和本地PC上的Linaro GDB。我的问题是调试会话将启动并且程序将执行,但断点不起作用,并且当手动暂停时“无法找到源”将导致。我的编译行选项(Linaro gcc)包含了-ggdb -O0,尽管许多人都提出但仍然存在同样的问题。最终我在远程板上尝试了gdb,它抱怨没有符号。奇怪的是,“文件”报告调试未在目标可执行文件上剥离。

我最终通过向链接器选项添加-g解决了这个问题。我不会完全理解为什么这会有所帮助,但我希望将其传递给其他人,以防它有所帮助。在这种情况下,Linux确实需要链接器选项上的-g。

答案 6 :(得分:1)

希望您编译的系统和要调试的系统具有相同的体系结构。我遇到一个问题,其中32位二进制调试符号拒绝在我的64位计算机上加载。切换到32位系统对我有用。

答案 7 :(得分:1)

对于那些带着这个问题来到这里并使用 Qt 的人:在 release 配置中有一个步骤,其中二进制文件被剥离作为​​执行 make install 的一部分。您可以传递配置选项 CONFIG+=nostrip 来告诉它不要:

代替:

qmake <your options here, e.g. CONFIG=whatever>

你添加了 CONFIG+=nostrip,所以:

qmake <your options here, e.g. CONFIG=whatever> CONFIG+=nostrip