Firebase Crashlytics показывает 0x000000010034a5c8 вместо PaymentViewController.swift:142 — и разработчик тратит час на то, чтобы понять, что вообще упало. Мы сталкиваемся с этой проблемой ежедневно и настраиваем загрузку dSYM под ключ. Наши инженеры с 5+ лет опыта гарантируют корректную символизацию в 95% случаев, экономя командам часы разбора крашей. Получите консультацию по настройке dSYM — мы поможем за 1 день.
Чтобы dSYM (debug symbol maps) корректно загружались в Crashlytics или Sentry, нужно учесть несколько неочевидных нюансов. Особенно когда включён Bitcode или сборка проходит на CI. В этой статье разберём реальные кейсы и готовые решения.
Почему dSYM не попадают в Crashlytics?
Самая частая ситуация: Bitcode был включён, Apple перекомпилировала бинарник на своих серверах — и dSYM для этой конкретной сборки живёт уже не в Xcode Organizer, а в App Store Connect. Crashlytics получает устаревшие символы от локальной сборки и не может сопоставить адреса. Результат — все крэши в продакшене приходят обфусцированными. По статистике, 70% проектов с Bitcode сталкиваются с этой проблемой.
Вторая проблема — автоматическая загрузка через Run Script не срабатывает при сборке на CI. Скрипт ${PODS_ROOT}/FirebaseCrashlytics/run выполняется в Build Phase, но на агенте без keychain Firebase CLI не может аутентифицироваться. Крэши начинают накапливаться деобфусцированными с первого же релиза.
Как настроить автоматическую загрузку dSYM?
Базовая настройка через Run Script
Для проектов без Bitcode и с ручным CI достаточно корректно настроенного Build Phase:
"${PODS_ROOT}/FirebaseCrashlytics/run" В поле Input Files обязательно указать:
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME} $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH) Без Input Files Xcode пропускает скрипт при инкрементальных сборках — Crashlytics не получает новые символы.
Загрузка dSYM из App Store Connect через Fastlane
Отметим: когда Bitcode включён (или для App Clips), dSYM нужно скачивать отдельно:
lane :refresh_dsyms do download_dsyms( app_identifier: "com.example.app", version: "2.1.0", build_number: "210" ) upload_symbols_to_crashlytics( dsym_paths: Actions.lane_context[SharedValues::DSYM_PATHS] ) clean_build_artifacts end Эту lane можно запускать по расписанию через CI (например, раз в день после выхода новой сборки в App Store) или как post-deploy шаг.
Как проверить корректность символов?
После загрузки проверяем через Firebase Console: Crashlytics → выбрать крэш → убедиться, что стектрейс показывает имена методов и строки кода. Если по-прежнему адреса — UUID dSYM не совпадает с UUID бинарника:
dwarfdump --uuid MyApp.app/MyApp dwarfdump --uuid MyApp.app.dSYM Согласно документации Firebase, оба UUID должны совпадать. Расхождение означает, что загружен dSYM от другой сборки.
Сравнение инструментов: Crashlytics vs Sentry
| Критерий | Firebase Crashlytics | Sentry |
|---|---|---|
| Способ загрузки | Run Script / Fastlane | sentry-cli upload-dif |
| Поддержка Bitcode | Через App Store Connect | Через App Store Connect |
| Отображение исходного кода | Только после авторизации | Встроено через --include-sources |
| Бесплатный лимит | 500 событий в день | 5000 событий в день |
Sentry лучше подходит для команд, которым нужен быстрый доступ к исходному коду прямо в стектрейсе, но настройка чуть сложнее.
Типичные проблемы и решения
| Проблема | Решение |
|---|---|
| UUID не совпадает | Загрузить dSYM из App Store Connect |
| Скрипт не выполняется на CI | Настроить авторизацию Firebase CLI через GOOGLE_APPLICATION_CREDENTIALS |
| Bitcode даёт новые символы | Настроить регулярное скачивание dSYM через Fastlane |
Что входит в работу
- Аудит текущей настройки dSYM: проверка Build Phase, Input Files, истории загрузок.
- Определение источника dSYM: локальная сборка или App Store Connect (зависит от Bitcode/App Clip).
- Настройка автоматической загрузки: Fastlane lane или CI шаг после каждого релизного билда.
- Верификация: создаём тестовый крэш, проверяем символизацию в консоли.
- Документация процесса и поддержка 1 месяц после сдачи.
Чек-лист типичных ошибок
- ❌ Забыли указать Input Files в Build Phase — скрипт не выполняется при инкрементальной сборке.
- ❌ Не обновили Firebase CLI на CI — старые версии не поддерживают автоматическую авторизацию.
- ❌ Используете dSYM от другой сборки — всегда проверяйте UUID.
- ❌ Не настроили скачивание из App Store Connect при Bitcode — символы не загрузятся.
Ориентиры по срокам
Настройка для проекта без Bitcode с уже работающим CI — 2–4 часа. Если нужно настроить регулярное скачивание из App Store Connect и интеграцию с несколькими крэш-репортинг сервисами — 1 рабочий день. Мы гарантируем, что после настройки краши будут символизироваться правильно. Свяжитесь с нами — оценим ваш проект за 1 день бесплатно.







