2014-11-07 1 views
3

С помощью специальной системы отчетов о сбоях (например, специализированных на Ask the user to send crash log after crash on iPhone) для отправки журнала приложение необходимо перезагрузить. Зачем? Нет ли возможности отправить его во время пользовательской обработки исключений? Или есть система отчетов о сбоях, которая не требует перезапуска приложения?Зачем нужен перезапуск для отправки журнала сбоев на iOS?

ответ

5

При возникновении сбоя приложение находится в очень неустойчивом состоянии. Таким образом, библиотека отчетов о сбоях не может ничего сделать, поскольку даже выделение памяти во время сбоя может нанести больший урон. Таким образом, отчеты SDK о сбоях могут использовать только так называемые методы async-safe C для сбора всех данных о сбоях. Любой Objective-C-код также не может быть обработан, а также не может использоваться сетевой стек iOS.

Также обратите внимание, что исключения являются лишь одним из примеров сбоев приложений в Objective-C, также возникают сбои, вызванные низкоуровневыми BSD-сигналами. Оба типа означают, что приложение находится в очень небезопасном и нестабильном состоянии, и как минимум код должен быть вызван во время сбоя.

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

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

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

3

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

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