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

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

symupload.py

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

В --help:

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

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

crashupload.py

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

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

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

Загрузчик символов написан на python3, самый простой способ им пользоваться - внутри окружения сборки.

В вашем .spec:

# Добавляем python3-requests ... BuildRequires: python3-requests ... # Отключаем перегенерацию build-id от версии приложения %undefine _unique_build_ids %global _no_recompute_build_ids 1 ... %install ... # после %install: # Прогоняем сборщик-загрузчик символов, заменяем $$TRACER_PLUGIN_TOKEN$$ на плагин токен из консоли на apptracer.ru chmod +x %{_sourcedir}/../3rdparty/tracer/symupload/symupload.py python3 %{_sourcedir}/../3rdparty/tracer/symupload/symupload.py -t $$TRACER_PLUGIN_TOKEN$$ -d %{buildroot}/usr/bin -o %{buildroot}/%{name}-symtree rm -rf %{buildroot}/%{name}-symtree

Нюансы

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

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

  • Для CMake таргет RelWithDebInfo предпочтительнее Release (потому что Release подразумевает -g0)

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