2015-09-30 50 views
8

這是一個通常的做法編譯與調試符號,然後使用objcopy的二進制分成釋放可執行文件,並與調試信息的文件(然後換行到單獨的包或存儲符號服務器上)。CMake的保存剝離調試信息

如何調試符號在適當的CMake分開?我只看過一些討論和不完整的代碼示例。

平臺是Linux和GCC。

回答

2

CMake的不具有這種直接的支持,但你可以使用一些POST_BUILD和INSTALL步驟來實現你想要的結果。但是,值得注意的是,使用objcopy並不是做這種事情的唯一方法。你也可以使用build-id,這可能更容易用CMake來強大的實現。

這裏有一個pretty good description of your choices and the methods,在幾年前由Michael Hertling發佈到CMake郵件列表中。我只是在這裏挑選出可供選擇的參考文獻,但我建議閱讀該鏈接。 GDB文檔中還有更多的complete discussion of the two alternatives,這些文檔應該填寫關於這兩種方法的剩餘空白(調試鏈接與build-id)。下面是邁克爾的常規構建-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 ==調試並建立;隨後,調用

GDB -EX「設置調試文件的目錄。」 -ex「文件主」

從CMAKE_BINARY_DIR中,您將按預期閱讀「找不到調試符號 」。現在,發出 「讓安裝」,再調用GDB,念道: 「從... /讀取符號構建-ID/AB/cdef1234.debug」

正如你所看到的,調試信息文件與剝離 可執行由構建ID僅連接;沒有objcopy視線。

以上使用的事實是.debug文件預計是一個正常的可執行文件,調試信息不​​會被剝離。