CMake сохранить удаленную отладочную информацию

Обычной практикой является компиляция с отладочными символами, а затем разделение двоичного файла с помощью objcopy на исполняемый файл выпуска и файл с отладочной информацией (затем заключать его в отдельные пакеты или хранить на сервере символов).

Как правильно разделить символы отладки в CMake? Я видел только некоторые обсуждения и неполные примеры кода.

Платформа — Linux и GCC.


person Velkan    schedule 30.09.2015    source источник


Ответы (1)


CMake не имеет прямой поддержки для этого, но вы можете использовать некоторые шаги POST_BUILD и INSTALL для достижения желаемого результата. Однако стоит отметить, что использование objcopy — не единственный способ сделать такого рода вещи. Вы также можете использовать идентификатор сборки, и это может быть проще реализовать с помощью CMake.

Вместо того, чтобы повторять все это здесь, есть довольно хорошее описание вашего выбора и методов, который несколько лет назад был опубликован в списке рассылки CMake Майклом Хертлингом. Я просто выберу рабочую альтернативу здесь для справки, но я рекомендую прочитать эту ссылку. Также есть еще более полное обсуждение двух альтернатив в Документация GDB, которая должна заполнить все оставшиеся пробелы в отношении двух подходов (отладочная ссылка или идентификатор сборки). Вот общий подход Майкла к идентификатору сборки (идентификатор сборки явно указан в его примере, прочитайте статьи, на которые есть ссылки, для объяснения того, что он должен представлять):

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, и вы прочтете «символы отладки не найдены», как и ожидалось. Теперь введите «make install», повторно вызовите gdb и прочитайте:

"Чтение символов из .../.build-id/ab/cdef1234.debug"

Как видите, файл отладочной информации связан с удаленным исполняемым файлом исключительно по идентификатору сборки; нет объекта в поле зрения.

В приведенном выше примере используется тот факт, что файл .debug должен быть обычным исполняемым файлом с не удаленной отладочной информацией.

person Craig Scott    schedule 23.11.2015