【发布时间】:2013-11-04 21:24:14
【问题描述】:
我遇到了 gcc 无法生成调试符号的奇怪问题,非常感谢一些帮助。
当然,我可能在这里做了一些愚蠢的事情,但我没有忘记 -g 或 -ggdb,而且我也没有在其中偷偷添加 -s。这是信息:
我有一个名为 list 的静态库(这是一项学校作业),以及两个以不同方式包含它的程序。
在 main(编译为 fifo)列表中包含为 #include "list.h",而在 prodcons 中,它包含为 #include "list/list.h"
当我在编译文件 prodcons 上运行 gdb 时,我收到消息“未找到调试符号”
编译后的fifo 文件也是如此。根据file 命令,两个文件都没有被剥离。
文件结构:
.
├── list
│ ├── list.c
│ ├── list.h
│ ├── main.c
│ └── Makefile
├── makefile
├── prodcons.c
.o 文件和二进制文件被排除在外。
以下是制作文件: 列表/生成文件: 全部:fifo liblist.a
OBJS = list.o main.o
LIBS= -lpthread
fifo: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS} -ggdb
liblist.a: list.o
ar rcs liblist.a list.o
clean:
rm -rf *o fifo
./makefile:
prodcons: prodcons.o
gcc -g -static -Wall -I./list -L./list -o $@ prodcons.o -llist -lpthread
clean:
@@rm prodcons prodcons.o
那么,有哪位大师准备好施展他们的魔法了吗? :)
【问题讨论】:
-
gcc 和 gdb 有哪些版本?
-
最终可执行文件 (fifo) 的行正在通过 -ggdb,但它在那里不是很有用,因为它是链接步骤。调试信息是在每个编译单元的编译步骤生成的。编译 list.o 和 main.o 时(从 list.c 和 main.c),看起来它们没有传递 -ggdb,因此没有生成调试信息。一个选项是定义 CFLAGS="-ggdb -O0" (启用优化的调试是一种......奇怪的体验)。 %.c -> %.o 的默认构建规则将选择 CFLAGS 并将标志传递给所有编译单元。 prodcons 也是如此。
-
如果您仍然没有得到调试符号,请检查
nm --debug-syms your_executables_name的输出。另请参阅nm。 -
只需将 CFLAGS 添加到 list/Makefile 即可解决两个可执行文件的问题。不知道我明白了,但谢谢。你应该让你的评论成为答案。
-
主教:gdb 7.6.1-1,gcc 4.8.2-3。
标签: debugging gcc gdb debug-symbols