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
有人可以告诉我,如果我在这里错过了一些简单的话吗?
答案 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
。)
通常,gcc
和gdb
将同步它们使用的调试符号类型,强制使用特定样式只会导致问题;除非您知道自己需要其他内容,否则请使用-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