通常的做法是使用调试符号进行编译,然后将使用的二进制文件分离objcopy
到发布可执行文件和带有调试信息的文件中(然后将其包装到单独的包中或存储在符号服务器上)。
如何在 CMake 中正确分离调试符号?我只看到了一些讨论和不完整的代码示例。
平台是 Linux 和 GCC。
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 配置并构建;随后,调用
gdb -ex "设置调试文件目录。" -ex“文件主要”
从 CMAKE_BINARY_DIR 中,您将按预期阅读“未找到调试符号”。现在,发出“make install”,重新调用 gdb 并阅读:
“从 .../.build-id/ab/cdef1234.debug 读取符号”
如您所见,调试信息文件仅通过构建 ID 与剥离的可执行文件相关联;看不到objcopy。
上面利用了这样一个事实,即该.debug
文件应该是一个正常的可执行文件,而调试信息没有被剥离。