Символизация отчетов о сбоях приложений для iPhone


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

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

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

что теперь?

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

symbolicatecrash crashreport.crash myApp.app.dSYM

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

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

24 420

24 ответа:

шаги для анализа отчета о сбое от apple:

  1. копия релиза .файл приложения, который был отправлен в appstore, the .файл dSYM, который был создан во время выпуска, и отчет о сбое получают от APPLE в папку.

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

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

Ex:atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508

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

Ex:[classname functionName:]; -510

символизируя IPA

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

Примечание

это может работать только в том случае, если двоичный файл приложения не имеет лишенных символов. По умолчанию релиз строит лишенные символы. Мы можем изменить его в настройках сборки проекта "Strip Debug Symbols During Copy" на NO.

Подробнее см. Это post

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

есть 3 актива, которые должны соответствовать друг другу при обозначении журнала сбоев:

  1. сам файл журнала сбоев (т. е. example.crash), либо экспортировать из органайзер в Xcode или получил из iTunes Connect.
  2. The (т. е. example.app), который сам содержит двоичный файл приложения, принадлежащий журналу сбоев. Если у вас есть .ipa пакета (т. е. example.ipa), то вы можете извлечь распакуйте .ipa пакета (т. е. unzip example.ipa). После этого .app пакет находится в извлеченном .
  3. The .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.приложение / пример с 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

в этом примере все активы подходят друг к другу, и вы должны быть в состоянии символизировать ваш stacktrace.

перейти к 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.каталог приложений для найти ее.

как вы можете видеть, больше нет параметров. Таким образом, скрипт должен найти двоичные и отладочные символы вашего приложения, запустив поиск spotlight. Он ищет символы отладки с определенным индексом под названием 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 пакет поиска spotlight, как показано ниже, вызывается symbolicatecrash:

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

если symbolicatecrash находит

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

Я сделал успешно, сейчас хочу поделиться со всеми вами, ребята.

Это следующие шаги:

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

Шаг 2: откройте Finder и перейдите в приложения, где вы найдете приложение Xcode, щелкните правой кнопкой мыши на этом и нажмите "Показать содержимое пакета", после это следовать этому простому пути

"содержание - > разработчик - > платформы - >iPhoneOS.платформа->разработчик->библиотека->PrivateFrameworks->DTDeviceKit.рамки - > Версии - >A - > Ресурсы"

или

"содержание - > разработчик - > платформы - >iPhoneOS.платформа->разработчик->библиотека->PrivateFrameworks->DTDeviceKitBase.рамки - > Версии - >A - > Ресурсы"

или

для Xcode 6 и выше путь есть Применения/Xcode.app / Contents/SharedFrameworks / DTDeviceKitBase.framework / Versions/A / Resources

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

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

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

  2. экспорт DEVELOPER_DIR= " /Applications / Xcode.приложение/содержание/разработчик" и нажмите Введите

  3. ./ symbolicatecrash-A-v MYApp_2013-07-18.crash MyApp.приложение.dSYM и нажмите Enter теперь все готово.. (Примечание: версии Вокруг 6.4 или более поздней версии не имеют-вариант - просто оставьте его)

Удачи В Кодировании.. Спасибо

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

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

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

  2. в терминале, cd в xcarchive например 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. вы вернулись к курсору блока, и вы можете вставить другие символы.

возможность пройти через ваш обратная трассировка одного элемента без повторного ввода первого бита-это хорошая экономия времени.

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

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

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

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

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

вы можете проверить, чтобы spotlight "видел" ваши файлы dysm, выполнив команду:

mdfind 'com_apple_xcode_dsym_uuids = *'

найдите dsym, который у вас есть в вашем каталоге.

примечание: по состоянию последний Xcode, больше нет каталога разработчика. Вы можете найти эту утилиту здесь:

/Применения/Xcode.app / Contents/SharedFrameworks / DTDeviceKitBase.framework / Versions/A / Resources / symbolicatecrash

шаги, чтобы символизировать отчет о сбое автоматически с помощью XCode:

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

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

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

  3. щелкните устройство слева и просмотрите журналы устройств на экране. право enter image description here

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

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

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

шаги

1.В Xcode>Окно>Устройства.

2.Выберите устройство из списка устройств в разделе Устройства.

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

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

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

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

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

1-Сначала перейдите в itunesconnect и загрузите свои журналы сбоев. Примечание: в большинстве случаев вы можете получить что-то вроде " слишком мало доклады были представлены для представления доклада."В основном недостаточно пользователей представили отчеты журнала сбоев в Apple, и в этом случае вы ничего не можете сделать в этот момент.

enter image description here

enter image description here

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

enter image description here

enter image description here

enter image description here

enter image description here

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

  • открыть организатор,
  • нажмите на журнал библиотеки / устройства в левой колонке
  • нажать на кнопку "Импорт" в нижней части экрана ...

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

в XCode 4.2.1 откройте органайзер ,затем перейдите в журнал библиотеки / устройства и перетащите его.файл аварии в список журналов сбоев. Он будет символизирован для вас через несколько секунд. Обратите внимание, что вы должны использовать тот же экземпляр XCode, на котором была архивирована исходная сборка (т. е. архив для вашей сборки должен существовать в Organizer).

волшебный организатор XCode не так уж волшебен в символизировании моего приложения. Я вообще не получил никаких символов для отчетов о сбоях, которые я получил от Apple из-за неудачного представления приложения.

Я попытался использовать командную строку, поместив отчет о сбое в ту же папку, что и .файл приложения (который я отправил в магазин) и т. д.dSYM файл:

$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"

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

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

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

очень специфический случай, я знаю. Но я решил поделиться на всякий случай.

вот еще одна проблема, которую я имею с symbolicatecrash – он не будет работать с приложениями, которые имеют пробелы в своем пакете (т. е. " тестовое приложение.приложение'). Примечание Я не думаю, что вы можете иметь пробелы в их имени при отправке, так что вы должны удалить их в любом случае, но если у вас уже есть сбои, которые нужно анализировать, patch symbolicatecrash (4.3 GM) как таковой:

240c240
<         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == $exec_name.app\"";
---
>         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == '$exec_name.app'\"";
251c251
<             my $cmd = "find \"$archive_path/Products\" -name $exec_name.app";
---
>             my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";

для тех, кто использует Airbrake, есть твердый ответ выше, но он не будет работать для меня без настройки:

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

  • создать новый dir на рабочем столе или где угодно
  • найти архив в вопросе в Xcode organizer
  • дважды нажмите, чтобы показать в Finder
  • дважды нажмите, чтобы показать содержимое пакета
  • копировать .и dSYM файл .файл приложения в новый каталог
  • компакт-диск в новый реж
  • выполните следующую команду: atos-arch armv7-o 'Vimeo.приложение'/'Видео'
  • терминал будет вводить интерактивный ход
  • вставьте в адрес памяти и нажмите enter, он выведет имя метода и номер строки
  • кроме того, введите следующую команду: atos-arch armv7-o 'Vimeo.приложение'/'Видео' Чтобы получить информацию только для одного адреса

комбинация, которая сработала для меня, была:

  1. скопируйте файл dSYM в каталог, где был отчет о сбое
  2. распакуйте ipa-файл, содержащий приложение ('unzip MyApp.ipa')
  3. скопируйте двоичный файл приложения из результирующей разнесенной полезной нагрузки в ту же папку, что и отчет о сбое и файл символов (что-то вроде "MyApp.app / MyApp")
  4. импорт или повторное обозначение отчета о сбое из XCode организатор

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

мне пришлось сделать много взлома сценария symbolicatecrash, чтобы заставить его работать правильно.

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

вы должны сделать копию вашего symbolicatecrash, прежде чем пытаться эти патчи, которые сделают его выглядеть в dsym:

по строке 212 в getSymbolPathFor_dsymUuid функция

212     my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);

вокруг строки 265 в функции matchesUUID

265             return 1;

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

  • копировать .приложение, crash_report и DSYM файлы в папке.
  • подключите устройство с помощью xcode
  • затем перейдите в окно - > выберите Устройства - > просмотр журналов устройств
  • затем выберите Это устройство, удалить все логи .
  • перетащите ваш сбой в разделе журнала устройства . это автоматически символизирует крах . просто щелкните правой кнопкой мыши на отчет и экспортировать его .

удачи в кодировании,
Рияз

Я предпочитаю a скрипт это будет символизировать все мои журналы сбоев.

предпосылки

создайте папку и положите туда 4 вещи:

  1. symbolicatecrash perl script - есть много ответов SO, которые говорят, что это местоположение

  2. в архиве сборки, которые соответствуют аварий (от органайзер в Xcode. просто как Show in Finder и копировать) [я не уверен, что это необходимо]

  3. все xccrashpoint пакеты - (от Xcode Organizer. Show in Finder, вы можете скопировать все пакеты в каталог, или один xccrashpoint вы хотели бы символизировать)

  4. добавьте этот короткий скрипт в каталог:

    #!/bin/sh
    
    echo "cleaning old crashes from directory"
    rm -P *.crash
    rm -P *.xccrashpoint
    rm -r allCrashes
    echo "removed!"
    echo ""
    echo "--- START ---"
    echo ""
    
    mkdir allCrashes
    mkdir symboledCrashes
    find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \;
    
    cd allCrashes
    for crash in *.crash; do
        ../symbolicatecrash $crash > ../symboledCrashes/V$crash
    done
    cd ..
    
    echo ""
    echo "--- DONE ---"
    echo ""
    

Скрипт

при запуске скрипта, вы получите 2 каталога.

  1. allCrashes - все аварии от всех xccrashpoint будет там.

  2. symboledCrashes - те же сбои, но сейчас со всеми символами.

  3. вам не нужно очищать каталог от старых сбоев перед запуском скрипта. он будет очищать автоматически. удачи вам!

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

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

настройка: quincykit back end, который получает отчеты. Никакой символики не было настроено, поскольку я даже не мог понять, что они предлагали мне сделать, чтобы заставить его работать.

исправление: загрузка отчетов о сбоях с сервера в интернете. Они называются "crash" и по умолчанию переходят в папку ~/Downloads/. Имея это в виду, этот скрипт будет "делать правильные вещь " и отчеты о сбоях будут отправляться в Xcode (органайзер, журналы устройств), и будет выполнена символизация.

сценарий:

#!/bin/bash
# Copy crash reports so that they appear in device logs in Organizer in Xcode

if [ ! -e ~/Downloads/crash ]; then 
   echo "Download a crash report and save it as $HOME/Downloads/crash before running this script."
   exit 1
fi

cd ~/Library/Logs/CrashReporter/MobileDevice/
mkdir -p actx # add crash report to xcode abbreviated
cd actx

datestr=`date "+%Y-%m-%d-%H%M%S"`

mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"

вещи могут быть автоматизированы, где вы можете перетащить в Xcode Organizer, сделав две вещи, если вы используете QuincyKit/PLCR.

во-первых, вы должны отредактировать удаленный скрипт admin/actionapi.php ~строка 202. Похоже, что он не получает правильную метку времени, поэтому файл заканчивается именем "crash" , которое Xcode не распознает (это хочет чего-то точечного краха):

header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');

во-вторых, на стороне iOS в QuincyKit BWCrashReportTextFormatter.m ~строка 176, изменить @"[TODO]" до @"TODO" чтобы обойти плохих персонажей.

atos устарел, поэтому, если вы используете OSX 10.9 или более позднюю версию, Вам может потребоваться запустить

xcrun atos

предупреждение: /usr / bin/atos перемещается и будет удален из будущей ОС X релиз. Теперь он доступен в инструментах разработчика Xcode, чтобы быть вызывается через: xcrun atos

Мне нравится использовать Textwrangler для определения ошибок в исходном двоичном отклонении загрузки приложения. (Данные сбоя будут найдены в вашей учетной записи itunesConnect.) Используя метод Сачина выше, я копирую оригинал.сбой в TextWrangler, затем скопируйте файл symbolicatecrash, который я создал, в другой файл TextWrangler. Сравнение двух файлов выявляет различия. Файл symbolicatecrash будет иметь различия, которые указывают на файл и номер строки проблем.

мы используем Google Crashlytics для контроля журналов сбоев, ощущение очень своевременное и удобное в использовании.

ссылки на документы: https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms

Все о пропавших dSYMs Ткань включает в себя инструмент для автоматической загрузки dSYM вашего проекта. Инструмент выполняется с помощью сценария /run, который добавляется в фазу сборки сценария запуска во время процесса подключения. Могут быть определенные ситуации однако, когда загрузка dSYM завершается неудачей из-за уникальных конфигураций проекта или если вы используете Bitcode в своем приложении. Когда загрузка завершается неудачно, Crashlytics не может символизировать и отображать сбои, и на панели мониторинга Fabric появится предупреждение "отсутствует dSYM".

отсутствующие dSYMs могут быть загружены вручную в соответствии с описанными ниже шагами.

Примечание.: В качестве альтернативы инструменту автоматической загрузки dSYM Fabric предоставляет инструмент командной строки (upload-symbols), который может быть вручную настроено для запуска как часть процесса сборки вашего проекта. Инструкции по настройке см. В разделе upload-symbols ниже.

...