Gdb重复"没有加载符号表"

时间:2014-04-21 22:48:12

标签: c makefile gdb symbols

好吧,尽管尝试了很多解决方案,但我还是无法让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文件,所以我确实需要使用文件:[行号]的东西。

1 个答案:

答案 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.