Русские Блоги
Трехсторонняя или самостоятельно разработанная статистика Framework, трехсторонние сервисы включают Fabric, Bugly и т. Д.
Crash Log, упомянутый в этой статье, предоставлен Apple.
получить
Приобретение оборудования
Подключите устройство через USB, а затем выберите в строке меню XCode: «Окно» -> «Устройства и симуляторы», затем выберите «Просмотреть журналы устройств».
Затем подождите, пока XCode скопирует журнал сбоев. В правом верхнем углу вы можете выполнить поиск по названию приложения. Например, я искал WeChat здесь. Вы можете щелкнуть правой кнопкой мыши, чтобы экспортировать журнал сбоев в локальный каталог для анализа:
При просмотре журнала сбоев XCode автоматически попытается использовать Symboliate, а то, что такое Symboliate, будет объяснено позже в этой статье.
XCode скачать
В строке меню XCode выберите «Окно» -> «Органайзер», переключитесь на вкладку «Сбои», после выбора версии вы можете автоматически загрузить соответствующую версию журнала сбоев:
Выберите Open In Project, затем выберите соответствующий проект, и мы знакомы с интерфейсом в повседневной разработке:
анализ
Для демонстрации используется WeChat Crash Log:
Информация об устройстве: iPhone 7, iOS 12 beta1
Информация о версии: WeChat 6.6.7.32 (6.6.7)
Header
Начало Crash Log — это заголовок, который содержит метаданные журнала:
Reason
Затем следует модуль причины сбоя:
Exception TypeУказывает тип исключения:
в <mach/exception_types.h> Мы можем найти это EXC_CRASH Конкретное значение:Ненормальный выход процесса。
Так что же означает SIGKILL? В заголовочном файле <sys/signal.h> Можно найти в:
Это указывает на то, что это исключение, которое нельзя ни отловить, ни проигнорировать, поэтому система решает завершить этот процесс.
Exception NoteКод в <mach/exception_types.h> Можно найти
Termination ReasonПредоставленная информация более подробная
0x8badf00dЭто очень распространенный код, который означает, что время запуска приложения слишком велико или основной поток застрял слишком долго, в результате чего система WatchDog убивает текущее приложение.
Thread
Далее идет стек вызовов каждого потока. Разрушенный поток будет помечен как сбойный. Например, стек вызовов основного потока выглядит следующим образом:
Вы можете видеть, что описания здесь все адреса 0x0000000102e74a5c 0x100490000 + 43928156 Мы можем найти проблему только путем преобразования их в информацию, такую как классы / методы в коде, о чем мы поговорим далее.
Регистрация
После стека стековых вызовов вы также можете увидеть состояние регистра во время Crash:
Исполняемый файл
В конце Crash Log находится исполняемый файл, где вы можете увидеть динамическую библиотеку, загруженную в то время.
Symbolication
Стек функций журнала сбоев, который мы только что получили:
Как видите,Эти адреса не дают нам никакой полезной информации. Мы должны преобразовать их в классы / функции, чтобы найти проблему. Этот процесс называется символизацией。
Вам нужно символизировать одну вещь: файл Debug Symbol, который мы часто называем файлом dsym.
Машинные инструкции обычно соответствуют строке кода в вашем исходном файле. Во время компиляции компилятор сгенерирует эту информацию отображения. В соответствии с настройкой сборки DEBUG_INFORMATION_FORMAT В настройках эта информация может храниться в двоичном файле или файле dsym.
Обратите внимание, что двоичный файл в журнале сбоев будет иметь уникальный uuid, а файл dsym также будет иметь уникальный uuid. UUID этих двух файлов может быть символизирован, только если они соответствуют друг другу.
Если вы решили загрузить файл dsym при загрузке в App Store, журнал сбоев, видимый из XCode, автоматически символизируется。
BitCode
Когда проект запускает BitCode, компилятор не генерирует машинный код, но генерирует промежуточный код, называемый битовым кодом. Будет ли этот бит-код скомпилирован в машину при загрузке в App Store?
Итак, возникает вопрос, окончательный процесс компиляции находится вне вашего контроля, так как получить файл dsym?
Ответ заключается в том, что Apple сгенерирует этот файл dsym, который вы можете скачать с XCode или iTunesConnect.
Загрузить из XCode: Window-> Orginizer-> Archives-> выбрать версию сборки-> Download dSYMs
Загрузить из iTunes Connect
Ручная символика
В журнале сбоев вы можете увидеть uuid, соответствующий изображению (исполняемый файл),
Может также использоваться grep Быстро найти UUID
Далее мы смотрим на uuid из dsym:
Только когда два uuids соответствуют друг другу, символизация может быть успешной.
XCode
XCode автоматически попытается символизировать Crash Log (требуется файл, заканчивающийся на .crash)
USB подключенное устройство
Откройте XCode, нажмите Device-> Window в строке меню
Нажмите Просмотр журналов устройства.
Затем перетащите журнал аварий на левую часть
XCode будет автоматически символизировать
XCode может автоматически символизировать следующие файлы:
Разбился исполняемый файл и файлы Dsym
Dsym файлы всех используемых фреймворков
Символы, связанные с версией ОС (XCode автоматически скопирует эти символы на устройство при подключении USB)
atos — это инструмент командной строки, который можно использовать для обозначения одного адреса. Формат команды следующий:
symbolicatecrash
symbolicatecrash — это встроенный инструмент XCode для обозначения всего журнала сбоев.
Если сообщается об ошибке
Переменные среды могут быть введены для решения этой проблемы
Предположим, что есть такой стек аварийных журналов.
Через стек вызовов мы знаем, что сбой произошел, когда был выпущен ивар логина LoginViewController, и у LoginViewController есть много атрибутов. Какой из них вызвал сбой?
Мы можем найти некоторые подсказки, посмотрев код сборки через lldb:
Сначала откройте терминал и импортируйте инструмент аварийного журнала.
Затем мы можем использовать серию команд, предоставленных этим сценарием
Загрузить журнал сбоев
Затем просмотрите код сборки:
Мы видим, что адрес этой строки является символическим адресом нашего сбоя:
Но регистр ПК всегда сохраняет следующую выполненную инструкцию, поэтому фактический сбой должен быть предыдущей инструкцией
Это не трудно увидеть через комментарии за ассемблерным кодом, проблема заключается в атрибутах database На.
Навыки общего кода и отладки
EXC_BAD_ACCESS/SIGSEGV/SIGBUS
Все три являются ошибками доступа к памяти, такими как выход за пределы массива, доступ к освобожденному объекту OC, попытка записи по адресу только для чтения и так далее. Этот тип ошибки обычно находит некоторые детали неправильного адреса в Подтипе Исключения.
При отладке необходимо соблюдать контекст стека вызовов:
Если вы видите это в контексте objc_msgSend и objc_release Часто пытаясь отправить сообщение объекту Objective C, который был выпущен, вы можете использовать Zombies для отладки.
Многопоточность также может быть причиной проблем с памятью.В настоящее время вы можете открыть Address Sanitizer и позволить ему найти многопоточный Data Race.
EXC_CRASH/SIGABRT
Эти два кода указывают на ненормальное завершение процесса. Наиболее распространенными являются исключения Objective C / C ++, которые не обрабатываются.
Расширения приложений принимают такой код, если они занимают слишком много времени во время инициализации и уничтожаются сторожевым таймером.
EXC_BREAKPOINT/SIGTRAP
Это похоже на аварийное завершение процесса, но такого рода исключение пытается сообщить отладчику, что такое исключение произошло. Если в данный момент нет подключенного отладчика, это приведет к завершению процесса.
Может быть пройдено __builtin_trap() Запустите это исключение вручную в коде.
Этот тип Crash часто появляется в базовой структуре iOS, наиболее распространенным является GCD, такой как dispatch_group
Код Swfit также будет демонстрировать такого рода исключения в следующих ситуациях:
Назначьте nil для необязательного типа значения
Killed [SIGKILL]
Процесс был принудительно убит системой, обычно вTermination ReasonПричину гибели можно найти:
0x8badf00d указывает, что время сторожевого таймера истекло, обычно основной поток застрял или время запуска превышает 20 секунд.
данные
WWDC:Understanding Crashes and Crash Logs
Understanding and Analyzing Application Crash Reports
▼ Нажмите « Читать оригинал "Введите программист Молл
Интеллектуальная рекомендация
Время выполнения тестовой программы
[Описание проблемы] Время работы программы является важным индикатором программирования. Как измерить время работы программы в QT? 【Анализ】 Тестовая функция способ 1 QTime, Его точность м.
Сплит EXCEL файлы по категориям
В работе по управлению вы столкнетесь с разделением отчета на различные подчиненные подразделения или разделением отчета, представленного подчиненным подразделением, на различные типы бизнеса. Пример.
How to Install RabbitMQ on CentOS 7
RabbitMQ is a widely used open-source message broker written in the Erlang programming language. As a message-oriented middleware, RabbitMQ can be used to implement the Advanced Message Queuing Protoc.
Разработка системы с высокой степенью параллелизма (передача)
оригинал: Учитель на зимних каникулах попросил его сделать обзор системных решений с высоким уровнем параллелизма, таких как веб-сайт бронирования 12306. После долгого и тщательного исследования он об.
Сообщение о событиях связывания морской черепахи Python
Код ошибки аномальный Вышеуказанное сообщение об ошибке приглашает 0 параметров, но пропущены 2 параметра. 2. Правильный код (функция привязки должна иметь два параметра, координаты времени прохождени.
Атюнс выдает ошибку «Произошел сбой itunes, создан файл minidump». Что делать?
Айтюнс загружается, даже происходит подключение телефона, а затем выдает ошибку «Произошел сбой itunes, создан файл minidump». На рабочем столе появляется папка iTunes Crash Logs и затем окошки о завершении работы нескольких приложений и самого тюнса. Такая же ситуация и если просто запустить программу, без подключения устройства. В чем может быть причина и как это исправить?
Trending sort
Trending sort is based off of the default sorting method — by highest score — but it boosts votes that have happened recently, helping to surface more up-to-date answers.
It falls back to sorting by highest score if no posts are trending.
Switch to Trending sort
The crashreports are now in XCode.
In XCode, open the «Organizer» Window.
In the Organizer, select an app, and click on the «Crashes» tab.
in iTunes connect, you can go to versions and scroll to: Additional Information at the bottom and click crash reports
@Kerni Looks like with new update the above described options are not available any more. Please follow the below steps to retrieve crash logs
- Add iTunes connect detail in account section of Xcode preferences.
- Then go to Window-> Organiser. You will get screen like https://developer.apple.com/library/ios/recipes/xcode_help-crashes_organizer/AboutCrashesOrganizer/AboutCrashesOrganizer.html where crashes are listed.
If you open iTunes connect in a web browser, click on «App Analytics» and select the app you are interested in, then a graph of crash reports will be shown at the bottom right. The title of this graph «Crashes» is a hyperlink and will take you to a more detailed crash report graph. However, to see the actual call stack for any individual crash, you will need to do this from the XCode Organizer tool.
The Google Developer console provides much more detail for reported app crashes in the browser as well as making it much easier to view user reviews. So Apple certainly has room for improvement here.
The menu doesn’t seem to be available any more. (Besides that you mostly did not see any crashes in there anyway, so it wasn’t useful)
Correction As @yeahdixon notes the crash reports link is now available below Additional Information .
My app was released yesterday, but there is no option for viewing crash reports in iTunes Connect for me at this point.
Как отправить разработчику iOS приложения логи об ошибках
Вчера обновил одно полезное приложение, которое получило редизайн под iOS 7, но вот новые плюшки после активации не позволяли мне запустить приложение, постоянно вылетало. Я связался с разработчиком и он попросил меня прислать ему crash reports (детальные логи о падении приложения).
Логи можно увидеть на вашем устройстве после перехода по пути Основные → Об этом устройстве → Диагностике и использование → Данные. Здесь вы найдёте много файлов с расширением .crash, например: Smart Coin_2013-12-11-015707_iPad-2.crash. Вы можете открывать каждый файл по очереди, но вам быстро надоест копировать информацию, так как почему-то для этих crash-файлов нет функции Выделить всё в контекстном меню.
Поэтому Apple и тут всё предусмотрели и сделали максимально удобно. Оказывается, что все эти crash-файлы и логи копируются на ваш компьютер после синхронизации с iTunes и хранятся по такому пути:
Mac OS X:
Windows XP:
C:\Documents and Settings\<USERNAME>\Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>
Windows Vista or 7/8:
C:\Users\<USERNAME>\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>
Всё, что вам необходимо сделать после синхронизации устройства с компьютером, это перейти по указанному пути, который соответствует вашей ОС, заархивировать crash-файлы и отправить разработчику.