Символизация

Для получения человекочитаемых трейсов необходимо собрать отладочную информацию (pdb/dwarf), которая генерируется при сборке приложения. Сборка и отправка отладочной информации осуществляется при помощи скриптов symupload/symupload.py. Их можно запускать автоматически (с проверкой на дубликаты) или вручную, но важно, чтобы процесс отправки выполнялся регулярно.

symupload.py

Используется для загрузки отладочной информации.

В --help:

ДирективаЧто нужно передавать
-dПапки с входными файлами с символами (артефактами билда).
-iКонкретные файлы, которые нужно отпроцессить
--input-listПуть до файла со списком файлов, которые нужно отпроцессить
-oЛюбой промежуточный путь, в котором на время загрузки будет сформировано дерево символов
-tplugin token
--target-platformНужен для кросс-компиляции – по умолчанию скрипт будет обрабатывать только исполняемые файлы для той платформы, с которой он запущен.
-xglob-ы для путей, которые нужно игнорировать при обходе. Например, -x *CMake* позволяет игнорировать выхлопы различных try_compile

Если передать -d, рекурсивно обойдёт все папки, найдёт там всё, что походит на исполняемый файл или разделяемую библиотеку под целевую платформу, скопирует от них отладочные символы в папку под -o, проверит, есть ли среди них что-либо новое, и загрузит, если есть.
Если передать -i, скрипт так же отпроцессит конкретные файлы
--input-list ожидает файл, где на каждой строчке записан абсолютный путь до файлов. Каждый путь процессится как если бы он был путем в -i

crashupload.py

Можно использовать для ручной отправки минидампа для проверки/перепроверки символизации. Не рекомендуется для нетестовых целей.

Минидамп после крэша можно найти в ${tracer_dir}/session-${guid}/crashes/.../*.dmp. Сам Tracer удаляет их после загрузки, так что лучше не перезапускать приложение на момент получения минидапма, либо воспользоваться tracer_keep_processed_crashes() в tracer.h

Пример подключения

В вашем CMakeLists.txt:

set(SYMUPLOAD ${CMAKE_SOURCE_DIR}/thirdparty/tracer/symupload/symupload.py) set(SYMTREE_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/symbols) add_custom_command( TARGET "my-application-name" POST_BUILD COMMAND python3 ${SYMUPLOAD} -x *CMake* -s ${CMAKE_SOURCE_DIR} -d ${CMAKE_BINARY_DIR} -o ${SYMTREE_LOCATION} -t ${!!YOUR_TRACER_PLUGIN_TOKEN!!} DEPENDS COMMENT "Upload symbols after build" DEPENDS ${SYMUPLOAD} VERBATIM )

Нюансы

  • Подход с минидампами позволяет символизировать даже сборки с -fomit-frame-pointer/эквивалентами, но с другой стороны требует отдельно загружать отладочную информацию для каждой сборки (с которой вы хотели бы видеть читаемые стектрейсы). Разумеется, если информации нет, то её и не загрузить.

В данном случае флаги -g0 и эквивалентные отключают генерацию отладочной информации.

  • В случае использования команды strip следует запускать symupload.py до её использования.

  • Дерево символов, которое symupload.py генерирует в -o, можно использовать как аргумент для стекволкера и из breakpad, и из rust-minidump, если вы собираетесь проинспектировать минидамп вручную (с помощью minidump_stackwalk).