好吧,尽管尝试了很多解决方案,但我还是无法让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文件,所以我确实需要使用文件:[行号]的东西。
答案 0 :(得分:4)
虽然您声称已在可执行文件cc -g
上使用myfilesys
编译,但GDB没有看到任何内容,正如您尝试使用GDB的file
命令所证明的那样:< / p>
(gdb) file myfilesys
Reading symbols from /.../myfilesys...(no debugging symbols found)...done.
告诉你你实际上使用cc -g
来编译myfilesys
,这意味着你要么从二进制文件中删除符号(我发现这不太可能,但我提到了这种可能性)或者没有任何目标文件具有调试符号。假设后者,您需要将cc -g -c
编译应用于每个单独的源文件。然后,每个生成的目标文件都有调试符号,生成的可执行文件也会有调试符号(只要在链接后不将它们删除)。
使用gmake
之类的标准makefile,通常可以通过使用CFLAGS
扩充-g
变量来轻松完成此操作。下面是一个完整的makefile,用三个源文件来说明这一点:
CFLAGS=-g
myfilesys: a.o b.o c.o
$(CC) $^ -o $@
GCC已经有隐式规则,知道如何从相应的.o
文件创建.c
文件。但是,您可以通过更改CFLAGS
变量来更改传递给编译器的命令行参数。预处理指令和包含目录通常通过扩充CPPFLAGS
变量来传入(C ++特定标志从CXXFLAGS
读取,但CPPFLAGS
选项传递给C和C ++编译器)
我们需要定义一个显式规则来创建可执行文件myfilesys
($(CC)
规则使用制表符缩进,makefile要求)。输入make
后,可执行文件将包含符号,GDB不会在您的可执行文件中报告缺少的符号(它可能会报告您使用的任何库中缺少的符号):
(gdb) file myfilesys
Reading symbols from /.../myfilesys...done.