2015-09-30 23 views
8

È una pratica normale compilare con i simboli di debug e quindi separare il file binario utilizzando objcopy nell'eseguibile di rilascio e il file con informazioni di debug (quindi avvolgerlo in pacchetti o archivi separati sul server dei simboli).CMake salva le informazioni di debug spogliato

Come separare correttamente i simboli di debug in CMake? Ho visto solo alcune discussioni e campioni di codice incompleti.

La piattaforma è Linux e GCC.

risposta

2

CMake non dispone di supporto diretto per questo, ma è possibile utilizzare alcuni passaggi POST_BUILD e INSTALL per ottenere il risultato desiderato. Tuttavia, vale la pena notare che l'utilizzo di objcopy non è l'unico modo per fare questo genere di cose. È anche possibile utilizzare l'id di build e questo potrebbe essere più facile da implementare in modo efficace con CMake.

Piuttosto che ripetere tutto qui, c'è uno pretty good description of your choices and the methods che è stato pubblicato nella mailing list di CMake alcuni anni fa da Michael Hertling. Prenderò qui l'alternativa di lavoro per riferimento, ma ti consiglio di leggere il link. C'è anche un altro complete discussion of the two alternatives nella documentazione GDB che dovrebbe riempire gli spazi vuoti sui due approcci (collegamento di debug versus build-id). Ecco approccio generale accumulo id di Michael (build-id è esplicitamente dato in suo esempio, leggere gli articoli di riferimento per una spiegazione di ciò che ci si aspetta di rappresentare):

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) 

Configurare con CMAKE_BUILD_TYPE == di debug e costruire; successivamente, invoca

gdb -ex "imposta debug-file-directory." -ex "file main"

all'interno di CMAKE_BINARY_DIR, e si legge "nessun simbolo di debug trovato" come previsto. Ora, problema "make install", re-invoke gdb e lesse: "simboli lettura da .../build-id/ab/cdef1234.debug"

Come si può vedere, le informazioni di debug il file è collegato con l'eseguibile spogliato solo dall'ID build; nessuna objcopy in vista.

Quanto sopra si basa sul fatto che il file .debug è un normale eseguibile con informazioni di debug non eliminate.