Символические отчеты о сбоях приложений iPhone - PullRequest
426 голосов
/ 22 сентября 2009

Я пытаюсь символизировать отчеты о сбоях моего приложения для iPhone.

Я получил отчеты о сбоях из iTunes Connect. У меня есть двоичный файл приложения, который я отправил в App Store, и у меня есть файл dSYM, который был сгенерирован как часть сборки.

У меня есть все эти файлы в одном каталоге, который индексируется с помощью spotlight.

Что теперь?

Я пытался вызвать:

symbolicatecrash crashreport.crash myApp.app.dSYM

и он просто выводит тот же текст, который находится в отчете о сбое, с которого он начинается, а не символически.

Я что-то не так делаю?

Ответы [ 25 ]

688 голосов
/ 10 февраля 2011

Шаги для анализа отчета о сбое от Apple:

  1. Скопируйте файл выпуска .app, который был помещен в магазин приложений, файл .dSYM, созданный во время выпуска, и отчет о сбое, полученный от APPLE, в FOLDER .

  2. Откройте приложение терминала и перейдите в созданную выше папку (с помощью команды cd)

  3. Выполнить atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH. Расположение памяти должно быть тем, в котором приложение потерпело крах согласно отчету.

Пример: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508

Это покажет вам точную строку, имя метода, которое привело к сбою.

Пример: [classname functionName:]; -510

Символизирующий IPA

если мы используем IPA для символизации - просто переименуйте расширение .ipa с помощью .zip, распакуйте его, тогда мы сможем получить папку полезных данных, содержащую приложение. В этом случае нам не нужен файл .dSYM.

Примечание

Это может работать только в том случае, если в двоичном файле приложения нет разделенных символов. По умолчанию в сборках релиза отсутствуют символы. Мы можем изменить его в настройках сборки проекта «Разобрать символы отладки во время копирования» на NO.

Подробнее см. сообщение

167 голосов
/ 02 декабря 2012

После прочтения всех этих ответов здесь для того, чтобы символизировать журнал сбоев (и, наконец, успешно), я думаю, что здесь отсутствуют некоторые моменты, которые действительно важны для определения того, почему вызов symbolicatecrash не производит символьный вывод.

Есть 3 ресурса, которые должны соединяться вместе при символизации журнала сбоев:

  1. Сам файл журнала сбоев (т.е. example.crash), либо экспортированный из органайзера XCode, либо полученный из iTunes Connect.
  2. Пакет .app (т. Е. example.app), который сам содержит двоичный файл приложения, принадлежащий журналу сбоев. Если у вас есть пакет .ipa (т.е. example.ipa), то вы можете извлечь пакет .app, разархивировав пакет .ipa (т.е. unzip example.ipa). После этого пакет .app находится в извлеченной папке Payload/.
  3. Пакет .dSYM, содержащий символы отладки (т.е. example.app.dSYM)

Перед началом символизации вы должны проверить, совпадают ли все эти артефакты, что означает, что журнал сбоев принадлежит вашему двоичному файлу и что отладочные символы - те, которые были созданы во время сборки этого двоичного файла.

Для каждого двоичного файла указан UUID, который можно увидеть в файле журнала сбоев:

...
Binary Images:
0xe1000 -    0x1f0fff +example armv7  <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff  dyld armv7s  <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...

В этом фрагменте журнал сбоев принадлежит двоичному образу приложения с именем example.app/example с UUID aa5e633efda8346cab92b01320043dc3.

Вы можете проверить UUID вашего двоичного пакета с помощью dwarfdump:

dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example

После этого вы должны проверить, принадлежат ли отладочные символы, которые у вас есть, также этому двоичному файлу:

dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example

В этом примере все ресурсы совмещены, и вы сможете символизировать свой стековый след.

Переход к сценарию symbolicatecrash:

В Xcode 8.3 вы должны иметь возможность вызывать скрипт через

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log

Если его там нет, вы можете запустить find . -name symbolicatecrash в каталоге Xcode.app, чтобы найти его.

Как вы можете видеть, больше никаких параметров не дано. Таким образом, скрипт должен найти двоичное и отладочное символы вашего приложения, выполнив поиск в центре внимания. Он ищет символы отладки с определенным индексом, называемым com_apple_xcode_dsym_uuids. Вы можете сделать этот поиск самостоятельно:

mdfind 'com_apple_xcode_dsym_uuids = *'

соответственно.

mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"

Первый вызов Spotlight дает вам все проиндексированные пакеты dSYM, а второй - пакеты .dSYM с определенным UUID. Если прожектор не найдет ваш пакет .dSYM, то symbolicatecrash тоже не найдется. Если вы делаете все это, например, в подпапке вашего ~/Desktop прожектора должно быть в состоянии найти все.

Если symbolicatecrash находит ваш пакет .dSYM, в symbolicate.log должна быть строка, подобная следующей:

@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )

Для поиска вашего .app пакета в центре внимания выполняется поиск, подобный следующему: symbolicatecrash:

mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"

Если symbolicatecrash находит ваш пакет .app, в symbolicate.log должен быть следующий фрагмент:

Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH

Если все эти ресурсы найдены symbolicatecrash, он должен распечатать символическую версию вашего журнала сбоев.

Если нет, вы можете напрямую передавать файлы dSYM и .app.

symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log

Примечание: Символическая обратная трассировка будет выводиться на терминал, а не symbolicate.log.

116 голосов
/ 20 апреля 2010

В последней версии Xcode (3.2.2) вы можете перетаскивать любые отчеты о сбоях в раздел «Журналы устройств» в Xcode Organizer, и они будут автоматически отображаться для вас. Я думаю, что это работает лучше всего, если вы создали эту версию приложения, используя Build & Archive (также часть Xcode 3.2.2)

72 голосов
/ 19 июля 2013

Я сделал это успешно, используя следующие шаги.

Шаг 1: Создайте папку на рабочем столе, я присваиваю ей имя «CrashReport» и помещаю три файла («MYApp.app», «MyApp.app.dSYM», «MYApp_2013-07-». 18.crash ") в нем.

Шаг 2: Откройте Finder и перейдите в Приложения, где вы найдете приложение XCode, щелкните по нему правой кнопкой мыши и нажмите «Показать содержимое пакета», после этого следуйте по этому простому пути. "Contents-> Developer-> Platforms-> iPhoneOS.platform-> Developer-> Library-> PrivateFrameworks -> DTDeviceKit.framework -> Versions-> A-> Ресурсы"

ИЛИ

"Contents-> Developer-> Platforms-> iPhoneOS.platform-> Developer-> Library-> PrivateFrameworks -> DTDeviceKitBase.framework -> Versions-> A-> Ресурсы"

OR

Для Xcode 6 и выше путь Применения / Xcode.app / Содержание / SharedFrameworks / DTDeviceKitBase.framework / Версии / A / Ресурсы

Где вы найдете файл «symbolicatecrash», скопируйте его и вставьте в папку «CrashReport».

Шаг 3: запустить терминал, запустить эти 3 команды

  1. cd / Users / mac38 / Desktop / CrashReport и нажмите кнопку ввода

  2. export DEVELOPER_DIR = "/ Applications / Xcode.app / Contents / Developer" и нажмите Enter

  3. . / Symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM и нажмите Enter Now is Done .. (ПРИМЕЧАНИЕ: версии около 6.4 или более поздней не имеют опции -A - просто оставьте ее выход).
29 голосов
/ 23 июня 2016

Шаги для автоматической символизации отчета о сбое с использованием XCode:

ОБНОВЛЕНО ДЛЯ XCODE 9

  1. Подключите любое устройство iOS к вашему Mac (да, физическое, да, я знаю, что это глупо)

  2. Выберите «Устройства» в меню «Окно». enter image description here

  3. Нажмите ваше устройство слева и ПРОСМОТРЕТЬ ЖУРНАЛЫ УСТРОЙСТВ справа enter image description here

  4. Wait. Это может занять минуту, чтобы появиться. Может быть, Command-A, тогда Delete ускорит это.

  5. Критический недокументированный шаг: переименуйте полученный в iTunesConnect отчет о сбое из расширения .txt в .crash расширение

  6. Перетащите отчет о сбое в эту область слева enter image description here

И тогда Xcode будет символизировать отчет о сбое и отображать результаты.

Источник: https://developer.apple.com/library/ios/technotes/tn2151/_index.html

28 голосов
/ 23 сентября 2009

Я также собрал dsym, комплект приложений и журнал сбоев вместе в одном каталоге перед запуском символического сбоя

Затем я использую эту функцию, определенную в моем .profile, чтобы упростить запуск symbolicatecrash:

function desym
{
    /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}

Добавленные аргументы могут вам помочь.

Вы можете убедиться, что прожектор «видит» ваши файлы dysm, выполнив команду:

mdfind 'com_apple_xcode_dsym_uuids = *'

Найдите dsym в вашем каталоге.

ПРИМЕЧАНИЕ. Начиная с последней версии Xcode, каталог для разработчиков больше не существует. Вы можете найти эту утилиту здесь:

/ Применения / Xcode.app / Содержание / SharedFrameworks / DTDeviceKitBase.framework / Vers ионов / A / Ресурсы / symbolicatecrash

28 голосов
/ 28 октября 2011

Я использую Airbrake в своих приложениях, который неплохо справляется с удаленной регистрацией ошибок.

Вот как я символизирую их с помощью atos, если это нужно обратному следу:

  1. В Xcode (4.2) перейдите к органайзеру, щелкните правой кнопкой мыши на архиве из который .ipa файл был создан.

  2. В терминале, cd в архив , например MyCoolApp 10-27-11 1.30 PM.xcarchive

  3. Введите следующее atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp' (не забывайте одинарные кавычки)

  4. Я не включаю свой символ в этот вызов. То, что вы получите, это блочный курсор на пустой строке.

  5. Затем я копирую / вставляю свой код символа в курсор этого блока и нажимаю войти. Вы увидите что-то вроде:

    -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)

  6. Вы вернулись к курсору блока и можете вставить другие символы.

Возможность сэкономить время при просмотре одного элемента без повторного ввода первого бита.

Наслаждайтесь!

20 голосов
/ 02 февраля 2015

Просто простой и обновленный ответ для xcode 6.1.1.

ШАГОВ

1.Xcode> Window> Устройства.

2.Выберите устройство из списка устройств в разделе УСТРОЙСТВА.

3.Выберите Просмотр журналов устройства.

4.В разделе «Все журналы» можно напрямую перетащить отчет.crash

5.Xcode автоматически символизирует для вас отчет о сбое.

6. Вы можете найти символьный отчет о сбое, сопоставив его дату / время с датой / временем, указанным в вашем отчете о сбое.

14 голосов
/ 06 июля 2014

Несмотря на то, что я разрабатывал приложения уже несколько лет, я впервые отлаживал бинарный файл, и я чувствовал себя полным NOOB, выясняющим, где все файлы, т.е. где находится * .app * .dSYM и журналы сбоев ? Мне пришлось читать несколько постов, чтобы понять это. Изображение стоит тысячи слов, и я надеюсь, что этот пост поможет кому-нибудь еще в будущем.

1- Сначала зайдите на itunesconnect и загрузите журналы сбоев. ПРИМЕЧАНИЕ. В большинстве случаев вы можете получить что-то вроде «Слишком мало отчетов отправлено для отображения». По сути, недостаточно пользователей отправили отчеты о сбоях в Apple, и в этом случае вы ничего не можете сделать в этот момент.

enter image description here

enter image description here

2 - Теперь, если вы не изменили свой код с момента отправки двоичного кода в Apple, запустите Xcode для этого проекта и снова выполните Product -> Archive. В противном случае просто найдите ваш последний представленный двоичный файл и щелкните по нему правой кнопкой мыши.

enter image description here

enter image description here

enter image description here

enter image description here

8 голосов
/ 14 июня 2011

Используя XCode 4, задача еще проще:

  • открытый органайзер,
  • нажмите на библиотеку | Журнал устройства в левой колонке
  • Нажмите кнопку «Импорт» в нижней части экрана ...

и вуаля. Файл журнала импортируется и символизируется автоматически для вас. При условии, что вы заархивировали сборку, используя XCode -> Product -> Archive first

...