好吧,尽管尝试了很多解决方案,但我还是无法让gdb工作。
我的makefile执行cc -g _________
并生成myfilesys
>gdb myfilesys
(gdb) break my_linked_list.c:90
No symbol table is loaded, use the "file" command...
(gdb) file myfilesys
Reading symbols from /home/jsexton/Work/cs492/hw3/myfilesys...(no
debugging symbols found)...done.
(gdb) break my_linked_list.c:90
No symbol table is loaded, use the "file" command...
有人看到问题了吗?我的程序被分成了30个.c文件,所以我真的需要使用file:[行号]这个东西。
尽管您声称在可执行文件myfilesys
上使用cc -g
进行了编译,但GDB没有看到任何内容,正如您尝试使用GDB的file
命令所证明的那样
(gdb) file myfilesys
Reading symbols from /.../myfilesys...(no debugging symbols found)...done.
根据您的说法,您实际上使用了cc -g
来编译myfilesys
,这意味着您已经从二进制文件中删除了符号(我认为这不太可能,但我提到了这种可能性),或者您的对象文件中没有调试符号。假设是后者,则需要将cc -g -c
编译应用于每个单独的源文件。然后,每个生成的对象文件都将具有调试符号,生成的可执行文件也将具有调试标记(只要链接后不将其剥离)。
对于标准的makefile(如gmake
),这通常可以通过用-g
扩充CFLAGS
变量来轻松实现。下面是一个完整的makefile,它用三个源文件来说明这一点:
CFLAGS=-g
myfilesys: a.o b.o c.o
$(CC) $^ -o $@
GCC已经有隐式规则,知道如何从相应的.c
文件创建.o
文件。但是,您可以通过更改CFLAGS
变量来更改传递给编译器的命令行参数。预处理指令和include目录通常通过扩充CPPFLAGS
变量来传递(特定于C++的标志从CXXFLAGS
读取,但CPPFLAGS
选项同时传递给C和C++编译器)。
我们需要定义一个显式规则来创建可执行的myfilesys
($(CC)
规则缩进一个制表符,这是makefile的要求)。键入make
后,可执行文件将有符号,GDB不会报告可执行文件中丢失的符号(它可能会报告您使用的任何库中丢失的信号):
(gdb) file myfilesys
Reading symbols from /.../myfilesys...done.