2015-09-30 15 views
8

デバッグシンボルでコンパイルし、objcopyを使ってバイナリをリリース実行ファイルとデバッグ情報付きファイルに分離してから(別のパッケージにパッケージ化するか、シンボルサーバーに格納する)、通常の方法です。CMakeはデバッグ情報を取り除きました

CMakeでデバッグシンボルを正しく分割する方法は?私はいくつかの議論と不完全なコードサンプルを見たことがあります。

プラットフォームはLinuxとGCCです。

答えて

2

CMakeはこれを直接サポートしていませんが、POST_BUILDとINSTALLのいくつかの手順を使用して、必要な結果を得ることができます。しかし、このようなことを行うには、objcopyを使用する方法だけではないことに注意してください。 build-idを利用することもできます。これはCMakeで堅牢に実装する方が簡単かもしれません。

ここですべてを繰り返すのではなく、数年前にMichael HertlingによってCMakeメーリングリストに投稿されたpretty good description of your choices and the methodsがあります。私は参照のためにここで働く代替案を選びますが、私はそのリンクを読むことをお勧めします。さらに2種類の方法(デバッグリンクとビルドIDの対比)に関する残りの空白を埋めるべきGDBのドキュメントにはさらにcomplete discussion of the two alternativesがあります。ここではマイケルの一般的なビルドIDのアプローチです(ビルド番号が明示的に彼の例に示されているが、表現するために何が期待されているかの説明については、参照記事を読む):CMAKE_BUILD_TYPEと

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) 

設定==デバッグビルド;続いて、

gdb -ex "set debug-file-directory"を呼び出します。 -ex "file main"

CMAKE_BINARY_DIR内から、 "no debugging symbols found"が予想通りに読み込まれます。さて、問題は "make install" を、再呼び出しのGDBと読み:

"... /からシンボルを読む/ AB/cdef1234.debug-IDを構築します。" あなたが見ることができるように、デバッグ情報を

をファイルは、ビルドIDで実行可能ファイルのみを使用してに接続します。視界にobjcopyはありません。

上記のように、.debugファイルは、デバッグ情報が取り除かれていない通常の実行可能ファイルであることが想定されています。

関連する問題