即使使用 -g 标志编译,gdb 中也没有调试符号

Posted

技术标签:

【中文标题】即使使用 -g 标志编译,gdb 中也没有调试符号【英文标题】:No debugging symbols in gdb even when compiling with -g flag 【发布时间】:2010-12-31 06:10:19 【问题描述】:

我正在尝试使用调试符号编译我的程序以在 gdb 中使用。我已将 -g 标志添加到我的 makefile 中,但是当我在 gdb 中加载程序时,我仍然得到“正在从...读取符号(未找到调试符号)”。怎么了?

这是我的 makefile 的精简示例,其中应该包含相关位:

CPP = g++
CFLAGS = -c -g -Wall

$(BIN): $(OBJ)
 $(CPP) $(LDFLAGS) $(OBJ) -o $(BIN) $(LIBS)

<test.o>: <test.cpp>
 $(CPP) $(CFLAGS) <test.cpp> -o <test.o>

如果你想看完整的东西,你可以去这里,虽然我不认为这是必要的:

http://pastebin.com/vGNjy0ga

其他注意事项.. 我在 Windows 上使用 MinGW 进行编译,我有 SFML 和 OpenGL 作为依赖项。

不,在我的 makefile 中找不到 -s 标志。

【问题讨论】:

你能用make -n 确认你确实在你的编译行上得到了-g 标志吗? F:\rowdump\rom\ROMV>make -n g++ -Wall src/obj/core.o src/obj/image.o src/obj/gnd.o src/obj/gat. o src/obj/world.o src/obj/rsw.o src/obj/camera.o src/obj/rsm.o src/obj/main.o -o romv -Wl,--enable-auto-import, -subsystem,windows -lsfml-main -lsfml-graphics -lsfml-window -lsfml-system -lopengl32 -lglu32 不存在!奇怪..我的 -ansi 和 -pendantic 标志也不见了。编辑:对不起文字墙。没想到会变成这样。 Kobie 粘贴的输出是用于默认目标的,用于链接,并且那里没有 -g 标志。我刚刚在 Ubuntu 上确认,仅在编译时链接期间不需要该标志。我觉得你应该试试“make -n test.o”看看用什么命令来编译。 附带说明,按照惯例,C++ 使用 CXXFLAGS,普通 C 使用 CFLAGS 【参考方案1】:

啊。我很抱歉。事实证明,我的 makefile 的“干净:”部分已损坏。因此,当我使用 make clean 时,什么也没发生。手动删除 .o 文件可解决问题。标志现在可以正常工作。感谢所有发布的人!现在可以删除了。

【讨论】:

奇怪的是,尽管 make -n 显示我的 -g 标志已被剥离,但实际上并没有。 binW 上面有评论说您的make -n 只显示链接部分,而不是编译部分。确保您只查看make -n test.o【参考方案2】:

在使用我在一些旧的 F77 代码上继承的 makefile 时,我遇到了同样的问题。我尝试了人们推荐的所有标志(-g -ggdb ...等) 解决方案已运行 ma​​ke clean 如果你没有那个或知道它的意思,基本上删除所有编译的(.o)文件。

makefile 不知道要重新编译,因为只更改了标志,所以当我认为是时,我实际上并没有使用 -g 或 -ggdb 进行编译。希望这对某人有帮助!

【讨论】:

【参考方案3】:

尝试替换

$(BIN): $(OBJ)
 $(CPP) $(LDFLAGS) $(OBJ) -o $(BIN) $(LIBS)

$(BIN): $(OBJ)
 $(CPP) $(CFLAGS) -o $(BIN) $(OBJ) $(LDFLAGS) $(LIBS)

(编辑) 注意:-c 选项不适用于可执行文件

【讨论】:

这行不通,因为最终的可执行文件不能使用-c。此外,似乎(来自对 GNU/Linux 上 g++ 4.4.1 的快速测试)链接时不需要-g 我的错,是的,你是对的 -c 选项不适用于可执行文件【参考方案4】:

我对 Mingw 没有太多经验,但尝试用 -ggdb 替换 -g。这可能会解决您的问题。根据 gcc 手册页

生成调试信息以供使用 由 GDB 提供。这意味着使用最 可用的表达格式(DWARF 2, stabs,或者原生格式,如果两者都没有 其中支持),包括 GDB 尽可能扩展。

【讨论】:

在我的 (GNU/Linux g++) 手册中,常规的 -g 说,“GDB 可以使用这些调试信息。” DWARF 2主要用于调试时获取MACROS的值 我试过-g,还有-g -ggdb。只有后者产生可读的符号。【参考方案5】:

我认为在将对象链接到二进制代码时需要-g

CPP = g++
CFLAGS = -g -Wall

$(BIN): $(OBJ)
 $(CPP) $(CFLAGS) $(OBJ) -o $(BIN) $(LDFLAGS) $(LIBS)

<test.o>: <test.cpp>
 $(CPP) $(CFLAGS) -c <test.cpp> -o <test.o>

【讨论】:

【参考方案6】:

我不确定,但我认为即使在链接时您也需要 -g。

【讨论】:

以上是关于即使使用 -g 标志编译,gdb 中也没有调试符号的主要内容,如果未能解决你的问题,请参考以下文章

在 x86 上使用 GDB 而不调试符号?

如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?

需要在 GDB 中加载共享库的调试符号

通过 GDB 调试 DMD 生成程序

gdb:无法设置断点:“没有加载符号表。使用“file”命令。“

与 MSVC++ 2010 编译器一起使用的调试器