【问题标题】:CMake save stripped debug informationCMake 保存剥离的调试信息
【发布时间】:2015-12-27 23:12:36
【问题描述】:

通常的做法是使用调试符号进行编译,然后使用 objcopy 将二进制文件分离为发布可执行文件和带有调试信息的文件(然后将其包装到单独的包中或存储在符号服务器上)。

如何在 CMake 中正确分离调试符号?我只看到了一些讨论和不完整的代码示例。

平台是 Linux 和 GCC。

【问题讨论】:

    标签: linux gcc cmake objcopy


    【解决方案1】:

    CMake 对此没有直接支持,但您可以使用一些 POST_BUILD 和 INSTALL 步骤来实现您想要的结果。然而,值得注意的是,使用objcopy 并不是做这种事情的唯一方法。您还可以使用 build-id,这可能更容易通过 CMake 稳健地实现。

    这里没有重复整个事情,而是在几年前由 Michael Hertling 将 pretty good description of your choices and the methods 发布到 CMake 邮件列表中。我将在这里挑选出可行的替代方案以供参考,但我建议阅读该链接。 GDB 文档中还有一个更多的complete discussion of the two alternatives,它应该填写关于这两种方法的任何剩余空白(调试链接与构建ID)。这是 Michael 的一般 build-id 方法(build-id 在他的示例中明确给出,阅读参考文章以了解它预期代表的内容):

    CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
    PROJECT(BUILDID C)
    SET(CMAKE_VERBOSE_MAKEFILE ON)
    SET(BUILDID "abcdef1234")
    STRING(SUBSTRING "${BUILDID}" 0 2 BUILDIDPREFIX)
    STRING(SUBSTRING "${BUILDID}" 2 8 BUILDIDSUFFIX)
    FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "int main(void){return 0;}\n")
    ADD_EXECUTABLE(main main.c)
    SET_TARGET_PROPERTIES(main PROPERTIES
        LINK_FLAGS "-Wl,--build-id=0x${BUILDID}")
    ADD_CUSTOM_COMMAND(TARGET main POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:main>
                                         ${CMAKE_BINARY_DIR}/main.debug
        COMMAND ${CMAKE_STRIP} -g $<TARGET_FILE:main>)
    INSTALL(FILES ${CMAKE_BINARY_DIR}/main.debug
        DESTINATION ${CMAKE_BINARY_DIR}/.build-id/${BUILDIDPREFIX}
        RENAME ${BUILDIDSUFFIX}.debug)
    

    使用 CMAKE_BUILD_TYPE==debug 和 build 进行配置;随后,调用

    gdb -ex "设置调试文件目录。" -ex "文件主"

    从 CMAKE_BINARY_DIR 中,您将看到“没有调试符号 找到”如预期的那样。现在,发出“make install”,重新调用 gdb 并阅读:

    “从 .../.build-id/ab/cdef1234.debug 读取符号”

    如您所见,调试信息文件与剥离的 由构建 ID 执行;看不到 objcopy。

    以上利用了.debug 文件应该是一个正常的可执行文件且调试信息未被剥离的事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多