簡體   English   中英

CMake保存剝離的調試信息

[英]CMake save stripped debug information

通常的做法是使用調試符號進行編譯,然后使用objcopy將二進制文件objcopy為版本可執行文件和帶有調試信息的文件(然后將其包裝到單獨的包中或存儲在符號服務器上)。

如何在CMake中正確分離調試符號? 我只看到了一些討論和不完整的代碼示例。

平台是Linux和GCC。

CMake沒有直接支持,但您可以使用一些POST_BUILD和INSTALL步驟來實現您想要的結果。 然而,值得注意的是,使用objcopy不是執行此類操作的唯一方法。 您還可以使用build-id,這可能更容易使用CMake實現。

這里不是重復整篇文章,而是幾年前由邁克爾·赫特林(Michael Hertling)發布到CMake郵件列表中的選擇和方法非常好的描述 我將在這里選擇工作替代方案以供參考,但我建議閱讀該鏈接。 還有一個關於 GDB文檔中兩個備選方案的完整的討論,它應該填補關於這兩種方法的任何剩余空白(調試鏈接與build-id)。 這是Michael的一般構建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“set debug-file-directory。” -ex“文件主”

從CMAKE_BINARY_DIR中,您將按預期讀取“未找到調試符號”。 現在,發出“make install”,重新調用gdb並閱讀:

“閱讀...... /。build-id / ab / cdef1234.debug中的符號”

如您所見,調試信息文件通過構建ID與剝離的可執行文件連接; 看不到任何對象。

上面使用的事實是.debug文件應該是一個普通的可執行文件,調試信息沒有被剝離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM