CMake保存剥离的调试信息

11

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

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

操作系统是Linux,并且使用的编译器是GCC。


1个回答

6
CMake没有直接支持这个功能,但是你可以使用一些POST_BUILD和INSTALL步骤来实现你想要的结果。值得注意的是,使用objcopy并不是唯一的方法。你还可以利用build-id来实现,这可能更容易在CMake中实现稳健性。
相比于在此重复整个过程,Michael Hertling曾在几年前CMake邮件列表上发布了一篇关于你的选择和方法的相当好的描述,我建议阅读该链接。 GDB文档中还有完整讨论两种方法的内容,它应该会填补关于这两种方法(调试链接与构建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配置并构建;随后,在CMAKE_BINARY_DIR中调用gdb -ex“set debug-file-directory。”-ex“file main”,您将像预期的那样读到“未找到调试符号”。现在,发出“make install”命令,重新调用gdb并阅读:“从… / .build-id / ab / cdef1234.debug读取符号”。正如您所看到的,调试信息文件仅通过构建ID与剥离的可执行文件相连接。这是因为.debug文件预计是带有未删除调试信息的普通可执行文件。

但我认为在配置时间内没有稳健地获取构建ID的方法。只有在构建后才能知道构建ID,因此也无法决定安装目标。 - user150497

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接