【发布时间】:2015-12-27 23:12:36
【问题描述】:
通常的做法是使用调试符号进行编译,然后使用 objcopy 将二进制文件分离为发布可执行文件和带有调试信息的文件(然后将其包装到单独的包中或存储在符号服务器上)。
如何在 CMake 中正确分离调试符号?我只看到了一些讨论和不完整的代码示例。
平台是 Linux 和 GCC。
【问题讨论】:
通常的做法是使用调试符号进行编译,然后使用 objcopy 将二进制文件分离为发布可执行文件和带有调试信息的文件(然后将其包装到单独的包中或存储在符号服务器上)。
如何在 CMake 中正确分离调试符号?我只看到了一些讨论和不完整的代码示例。
平台是 Linux 和 GCC。
【问题讨论】:
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 文件应该是一个正常的可执行文件且调试信息未被剥离的事实。
【讨论】: