【问题标题】:Gdb repeated "no symbol table is loaded"gdb重复“未加载符号表”
【发布时间】:2014-06-06 02:30:01
【问题描述】:

好吧,尽管尝试了很多解决方案,但我还是无法让 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:[line number] 的东西。

【问题讨论】:

  • 你能显示完整的命令行吗?链接前是否将文件编译成 .o?
  • 在命令行输入file myfilesys。这将打印文件类型。打印大量信息,确保它显示“未剥离”。随时将输出添加到您的问题中。
  • 当它在你的文件中加载时显示...(no debugging symbols found)...,这意味着它。检查以确保您的 makefile 确实在对每个 .c 文件进行 cc -g -c 编译,而不仅仅是创建 myfilesys 的最后一个文件。如果您所有的资源都在一个目录中,您可以使用cc -g *.c -o myfilesys

标签: c makefile gdb symbols


【解决方案1】:

尽管您声称在您的可执行文件myfilesys 上使用cc -g 进行了编译,但 GDB 看不到任何内容,正如您尝试使用 GDB 的 file 命令所证明的那样:

(gdb) file myfilesys
Reading symbols from /.../myfilesys...(no debugging symbols found)...done.

相信您实际上已经使用cc -g 来编译myfilesys,这意味着您要么已经从二进制文件中删除了符号(我认为这不太可能,但我提到了这种可能性),或者没有您的目标文件有调试符号。假设是后者,您需要将cc -g -c 编译应用于每个单独的源文件。然后,每个生成的目标文件都会有调试符号,生成的可执行文件也会有调试符号(只要你在链接后不去掉它们)。

对于像gmake 这样的标准makefile,这通常可以通过用-g 扩充CFLAGS 变量来轻松完成。下面是一个完整的 makefile,用三个源文件说明了这一点:

CFLAGS=-g

myfilesys: a.o b.o c.o
        $(CC) $^ -o $@

GCC 已经有隐式规则,知道如何从相应的.c 文件创建.o 文件。但是,您可以通过更改CFLAGS 变量来更改传递给编译器的命令行参数。预处理指令和包含目录通常通过增加CPPFLAGS 变量来传递(C++ 特定标志从CXXFLAGS 读取,但CPPFLAGS 选项被传递给C 和C++ 编译器)。

我们需要定义一个显式规则来创建可执行文件myfilesys$(CC) 规则缩进一个制表符,这是 makefile 的要求)。键入make 后,可执行文件将包含符号,GDB 不会报告您的可执行文件中缺少符号(它可能会报告您使用的任何库中缺少符号):

(gdb) file myfilesys
Reading symbols from /.../myfilesys...done.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多