【问题标题】:g++ does not produce debug symbolsg++ 不产生调试符号
【发布时间】:2017-11-05 10:03:36
【问题描述】:

我正在学习 linux,我的第一步是调整我的project 以在 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 选项

【问题讨论】:

  • 尝试使用 -ggdb 标志而不是仅使用 -g。
  • 你怎么确定没有生成DWARF格式的调试信息?你的GCC 是什么版本?尝试使用g++ -v编辑您的问题以改进它。
  • 您是否在构建之前删除了所有目标文件(尝试make clean)?
  • Linux 不是 Windows,对此感到抱歉。你需要了解更多。不要让您的 Windows 构建适应 Linux,而是从头开始编写一个新的 Makefile,也许使用更简单的源目录组织。拥有SourceIncludes 子目录只会让您感到困惑。对于像你这样的小项目,考虑一个平面源文件树。从其他免费软件项目中寻找灵感。
  • Linux 不使用任何pdb 文件(我从未听说过)。 DWARF 调试信息通常在 .o 目标文件中(有一些奇怪的方法可以在其他地方获取它,我从来没有这样做过)所以在你的 ELF 可执行文件中。

标签: c++ linux makefile gnu-make


【解决方案1】:

根据你的 makefile 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字符串)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      如果您在再次运行 make 之前更改了选项,请务必运行 make clean,否则它将无法重新编译。

      最后,确保您没有在可执行文件上运行诸如strips 命令之类的额外步骤(这会删除调试符号)。

      你可以使用

      objdump --syms <executable-file>
      

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

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

      SYMBOL TABLE:
      no symbols
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 2015-11-02
        • 2014-11-14
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多