当我通过gdb调试时为什么“现在没有符号文件”?

时间:2013-05-30 08:00:42

标签: c gcc makefile gdb

Makefile是:

 objects = disk.o super.o inode.o namei.o open.o main.o

test : $(objects)
        cc -g -Wall -O2 -o test $(objects)

disk.o : fs.h disk.h
        cc -g -Wall -O2 -c disk.c

namei.o : fs.h
        cc -g -Wall -O2 -c namei.c 

open.o : fs.h
        cc -g -Wall -O2 -c open.c

super.o : fs.h
        cc -g -Wall -O2 -c super.c

inode.o : fs.h
        cc -g -Wall -O2 -c inode.c

main.o : fs.h disk.h sched.h
        cc -g -Wall -O2 -c main.c

.PHONY : clean
clean:
        rm edit $(objects) 

我使用“-g”,但是当我通过gdb调试它时:

gdb test

信息是:

Reading symbols from /root/lx/filesystem/lx_filesystem/test...(no debugging symbols found)...done.
(gdb) file
No executable file now.
No symbol file now.

这是为什么?
谢谢

2 个答案:

答案 0 :(得分:2)

您需要确认二进制文件中是否包含调试符号。在Linux上,您可以运行

file test
,它应该告诉您符号是否已被剥离。或者尝试
nm -C test
查看测试二进制文件中包含的符号列表。如果您看到类似
nm: test: no symbols
的内容,那就是问题所在。如果它们没有被剥离,那么你的调试符号可能不是gdb风格的(参见this question)。

答案 1 :(得分:1)

您的Makefile在某些方面不正确。这应该更好:

objects = disk.o super.o inode.o namei.o open.o main.o
CFLAGS = -g -Wall -O2

test : $(objects)
disk.o : fs.h disk.h disk.c
namei.o : fs.h namei.c
open.o : fs.h open.c
super.o : fs.h super.c
inode.o : fs.h inode.c
main.o : fs.h disk.h sched.h main.c

.PHONY : clean
clean:
        rm test $(objects)

但那不是你的问题。这样:

  

(gdb)文件
  现在没有可执行文件。

正在发生,因为您重置文件要调试 nothing 。不要那样做。

你真正的问题是:

  

从/root/lx/filesystem/lx_filesystem/test ...处读取符号(找不到调试符号)...完成。

为什么没有调试符号?如果您的可执行文件是使用您提供的Makefile构建的,那么它应该有调试符号。那时唯一合乎逻辑的结论是它不是。可能发生的情况是您修改了Makefile,但没有重新制作,并且仍在调试在没有-g的情况下构建的可执行文件。

使用固定的Makefilemake clean all

  • 使用-g重建所有目标文件(您应该看到它们是在-g输出中使用make重建的。
  • 为您提供带有调试符号的可执行文件。