Что такое символизация логов крашей (Crash Log Symbolication) в iOS?

Ответ

Символизация — это процесс преобразования сырых адресов памяти из лога аварийного завершения (Crash Log) в читаемые имена символов (названия функций, классов, строк кода). Без нее лог содержит только шестнадцатеричные числа, что делает анализ невозможным.

Для символизации необходимы:

  1. Сам лог краша (стек вызовов с адресами).
  2. dSYM-файл (Debug Symbols File), уникальный для каждой сборки. Он является ключом для сопоставления адресов и символов.

Как выполнить символизацию вручную с помощью atos:

# Формат команды:
# atos -o <Путь_к_исполняемому_файлу_в_dSYM> -arch <Архитектура> <Адрес_в_логе>

atos -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp 
     -arch arm64 
     0x00000001000abcde
# Вывод: -[ViewController viewDidLoad] (in MyApp) (ViewController.swift:25)

Где найти dSYM-файлы?

  • В архиве Xcode: Window → Organizer → Archives.
  • Убедитесь, что в настройках сборки включено: Build Settings → Debug Information Format = DWARF with dSYM File.

Автоматическая символизация:

  • Xcode Organizer: Загружает краши с устройств пользователей, если доступны dSYM.
  • Сервисы (Crashlytics, Sentry): Автоматически символизируют краши при загрузке dSYM.

Важно: dSYM-файлы критически важны и должны храниться для каждой сборки, опубликованной в App Store или TestFlight. Без них символизация крашей от пользователей будет невозможна.

Ответ 18+ 🔞

А, ну вот, опять этот цирк с символизацией, блядь! Сидишь такой, смотришь на лог краша, а там одни адреса, шестнадцатеричные, как будто инопланетяне писали. «0x00000001000abcde», «0x00000001000abf00», ёпта! И что с этим делать? Ни хуя не понятно, где сбой, в какой функции, на какой строчке.

Это ж надо всё символизировать, сука! То есть, взять эти сырые цифры и превратить их в нормальные, человеческие названия. Чтобы вместо «0x00000001000abcde» ты видел «-[ViewController viewDidLoad] (ViewController.swift:25)». Вот это уже дело, блядь! Уже можно понять, где косяк.

Но чтобы эта магия случилась, тебе нужен ключ, блядь! Без ключа — нихуя не получится. И ключ этот называется dSYM-файл (Debug Symbols File). Это такая специальная папка, которую Xcode генерит для каждой твоей сборки, уникальная, как отпечатки пальцев. В ней и спрятана вся карта, как эти адреса превращаются в имена функций.

Вот как это вручную делается, через консоль, командой atos:

atos -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp 
     -arch arm64 
     0x00000001000abcde

Смотри, что тут происходит, бля:

  • -o — ты указываешь путь к самому исполняемому файлу, который внутри этого dSYM-архива. Он обычно лежит по такому вот длинному пути.
  • -arch — архитектура, потому что под капотом у современных айфонов может быть и arm64, и arm64e. Если укажешь не ту — нихуя не сработает, будет молчать как партизан.
  • И в конце сам адрес из лога, который тебя ебет.

Нажмешь Enter — и, если всё правильно, тебе выплюнет красивую строчку с названием функции и файла. Волшебство, ёпта!

А где, сука, эти dSYM-файлы искать?

  • В архивах Xcode (Organizer): Заходишь в Window → Organizer → Archives, находишь нужную сборку, жмешь правой кнопкой — «Show in Finder». Там будет папка с архивом, а в ней — твой драгоценный dSYM.
  • Но сначала убедись, что он вообще генерится! Зайди в настройки проекта (Build Settings), найди пункт Debug Information Format и поставь ему значение DWARF with dSYM File. Иначе Xcode может сэкономить место и не создавать этот файл, а потом ты будешь сидеть и ебаться с логами как дурак.

Автоматическая символизация — для ленивых (и умных):

  • Xcode Organizer сам может подхватывать краши с устройств пользователей и символизировать их, если у него есть доступ к нужным dSYM.
  • Сервисы вроде Crashlytics или Sentry — вообще красавцы. Загрузил им dSYM один раз для сборки, и они все краши от пользователей будут автоматически расшифровывать. Сидишь, кофе пьешь, а тебе уже готовый, понятный стек вызовов приходит.

И главное, блядь, запомни навсегда: эти dSYM-файлы — критически важны, как паспорт для сборки. Сохраняй их для каждой версии, которую ты выложил в App Store или даже в TestFlight. Выложил сборку — сразу dSYM в надёжное место (или настрой автоматическую загрузку в сервис крашей). Потому что если пользователь начнёт вылетать, а у тебя dSYM-файл потерялся — всё, пиши пропало. Будешь смотреть на эти «0x00000001000abcde» и чувствовать себя полным мудаком, который не может найти баг. Не доводи до этого, сохраняй символы, блядь!