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.
这是为什么?
谢谢
答案 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
的情况下构建的旧可执行文件。
使用固定的Makefile
和make clean all
-g
重建所有目标文件(您应该看到它们是在-g
输出中使用make
重建的。