Для получения человекочитаемых трейсов необходимо собрать отладочную информацию (pdb/dwarf
), которая генерируется при сборке приложения. Сборка и отправка отладочной информации осуществляется при помощи скриптов symupload/symupload.py
. Их можно запускать автоматически (с проверкой на дубликаты) или вручную, но важно, чтобы процесс отправки выполнял ся для всех билдов, с которых вам нужны будут отсимволизированные креши.
symupload.py
Используется для загрузки отладочной информации.
В --help
:
Аргумент | Что нужно передавать |
---|---|
-d | Папки с артефактами билда (можно несколько). |
-o | Любой промежуточный путь, в котором на время загрузки будет сформировано дерево символов |
-t | plugin token |
-x | glob -ы для путей, которые нужно игнорировать при обходе. Например, -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
).