QuincyKit/PLCrashReporter: предоставить описание * до * сбоя
Я использую QuincyKit, который работает поверх PLCrashReporter, чтобы обнаружить производственные сбои в моем приложении для iOS и получить журналы. Иногда это было бы чрезвычайно полезно для отладки, если бы у меня было несколько переменных из нескольких уровней стека вызовов выше точки сбоя. Например, с каким идентификатором записи произошел сбой, если код обработки записи имеет много уровней вложенности.
Вопрос в том, есть ли способ предоставить некоторую строку контекста, которая будет вставлена в журнал сбоев в качестве описания во время генерации? Я установил бы это при входе в стек вызовов для записи, я очистил бы это при выходе. Лучше, если оно непостоянно (то есть в памяти) - боюсь, что запись в энергонезависимое хранилище все время будет обременительной для батареи.
2 ответа
Найден ограниченный обходной путь. Я использую блок разделяемой памяти с именем, полученным из идентификатора пакета, для хранения строки контекста. Блок очищается при правильном отключении. Тогда я переопределяю -crashReportDescription
в моем делегате Quincy, так что он предоставляет содержимое общей памяти, если таковые имеются, в качестве описания. Это только непусто, если последнее закрытие приложения было сбоем.
Очевидно, что у этого подхода есть недостатки. Если они, скажем, перезагружают устройство между сбоем и следующим запуском приложения, информация об общей памяти теряется.
РЕДАКТИРОВАТЬ: в первой версии проекта я использовал частную, названную UIPasteboard вместо общей памяти. Это оказалось хитом производительности. Общая память на порядки быстрее.
EDIT2: но затем они сломали разделяемую память в iOS 7, поэтому UIPasteboard вернулся. Облом.
РЕДАКТИРОВАТЬ 3: нашел другой подход, менее элегантный, но он работает в iOS 7. Я храню свою контекстную строку в простом статическом блоке памяти. Я помещаю пользовательский обработчик сбоя в PLCrashReporter с помощью [[PLCrashReporter sharedReporter] setCrashCallbacks:]
, В обработчике я записываю указанный контекст (если есть) в файл. При запуске приложения я читаю указанный файл и предоставляю содержимое (если есть) в -crashReportDescription
, Уходи, UIPasteboard.
Нет, но эта функция была предложена более 2 лет назад, и есть патч.
Я бы на самом деле предпочел версию, которая позволяла бы регистрировать содержимое кольцевого буфера (в который вы могли бы эффективно записывать сообщения!), Что потенциально намного более полезно.