1

生成文件是:

 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.

这就是为什么?
谢谢

4

2 回答 2

2

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

文件测试
这应该告诉您符号是否已被剥离。或者试试
nm -C 测试
查看测试二进制文件中包含的符号列表。如果你看到类似的东西
nm:测试:无符号
那么这就是问题所在。如果它们没有被剥离,那么您的调试符号可能不是 gdb 样式的(请参阅此问题)。

于 2013-05-30T13:56:46.763 回答
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) 文件
现在没有可执行文件。

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

你真正的问题是这样的:

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

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

使用固定的Makefile,并且make clean all应该

  • 重建所有目标文件-g(你应该看到它们-gmake输出中重建。
  • 给你一个带有调试符号的可执行文件。
于 2013-05-30T13:51:12.770 回答