即使使用 -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 ...等) 解决方案已运行 make 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 中也没有调试符号的主要内容,如果未能解决你的问题,请参考以下文章
如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?