G++ 不生成调试符号

g++ does not produce debug symbols

本文关键字:调试 符号 G++      更新时间:2023-10-16

我正在学习Linux,我的第一步是调整我的项目以在Linux上运行。这是简单的makefile(主要是出于教育目的),它生成文件:

#------------------------BUILD VARIABLES-----------------------------
#   Directories, containing headers
INCLUDE_DIR = ../Include/
#   Output directory which will contain output compiled file
OUTPUT_DIR = ../Bin/Debug/
SOURCES = EngineManager.cpp Geometry.cpp Main.cpp Model.cpp 
      Shaders.cpp TGAImage.cpp 
HEADERS = EngineManager.h Geometry.h Line.h Model.h Shaders.h 
      TGAImage.h Triangle.h
#------------------------BUILD_RULES---------------------------------
TinyRenderBuilding : $(addprefix $(INCLUDE_DIR), $(HEADERS)) $(SOURCES)
    mkdir -p  $(OUTPUT_DIR)
    g++ -std=c++14 -o $(OUTPUT_DIR)TinyRender.out -g -I$(INCLUDE_DIR) $(SOURCES)

我不明白,为什么g++不生成调试符号? 显示-g选项

要在编译时包含调试符号g++您需要传递-g选项。

在制作文件中,这通常意味着将其添加到CXXFLAGS

还要确保在创建可执行文件时传递-g选项:编译时将.cpp文件转换为.o文件,执行链接时,将这些.o文件转换为可执行文件)。

如果在再次运行make之前更改选项,请确保运行make clean原因,否则不会重新编译它。

最后,确保您没有其他步骤,例如在可执行文件上运行strips命令(这将删除调试符号)。

您可以使用

objdump --syms <executable-file>

以检查可执行文件是否具有符号。

当它没有符号时,它会说如下:

SYMBOL TABLE:
no symbols

(我不是C/C++编程专家,我只是在尝试调试其他人代码时遇到这个问题)

根据您的生成文件,g++应该生成调试符号(-g显示选项)。要确认这一点,您可以对生成的二进制文件运行file

$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9fe588c18099ef418daf288931bb033cc287922e, with debug_info, not stripped

(注意输出中的字符串with debug_info

我不完全确定,但你可以尝试-g或-ggdb。你可以对这些做一些研究。我们使用这些参数通过 gdb 工具调试 C 程序。