Ответ 1
В основном существуют два типа сбоев:
- Невозможно удалить исключения, которые можно найти с кодом, похожим на ваш
- Аварии на основе сигналов, которые могут быть захвачены обработчиками сигналов (или обработчиками Mach Exception, но которые не будут захватывать все сигналы)
Затем, поймав любую из этих сбоев, вам нужно получить трассировку стека (из всех потоков). [NSException callStackSymbols]
предоставит вам некоторые символы (только для сбоя исключений), для большого количества символов ОС он будет показывать только redacted
, для вашего приложения он предоставит некоторые символы, если вы не разделите их с вашего двоичного файла. Рекомендуется удалить символы из двоичного файла, чтобы уменьшить размер файла (много), и эти символы также никогда не будут содержать имена файлов и номера строк.
Поэтому вместо этого вам нужно получить следующую информацию из фреймов стека: двоичный, двоичный UUID, архитектура процессора и адрес памяти. [NSException callStackReturnAddresses]
предоставит вам адреса памяти, но снова только для сбоя на основе исключения. Кроме того, он не обеспечивает двоичное изображение, соответствующее адресу памяти.
Таким образом, вам нужно получить список двоичных изображений с диапазоном адресов в памяти, каждый из которых содержит два бинарных изображения, а также способ получить адреса памяти фреймов стека для потоков также для сбоев, основанных на исключениях. Если вы хотите узнать, как это происходит, вы в основном можете взглянуть на ВСЕ код PLCrashReporters, поскольку это цель проекта с открытым исходным кодом, и это не та область StackOverflow, которая объясняет такие сложные сценарии. Прочтите код, документацию и узнайте:) Чтобы дать вам краткое описание: не делайте этого самостоятельно, просто используйте PLCrashReporter.
Теперь, чтобы получить символы, включая имена файлов и номера строк, вам необходимо символизировать отчеты о сбоях, используя символы ОС для соответствующей версии ОС и соответствующей архитектуры ЦП с устройства, на котором произошел сбой. Также вам нужны пакеты символов (dSYM) из точных двоичных (и фреймворков), которые вызвали отчет о сбое из вашего приложения. Каждое двоичное изображение имеет уникальный UUID и файл символов, который вы используете для получения символов, должен иметь один и тот же UUID для той же архитектуры процессора.
Теперь вам нужно запустить инструмент atos
, чтобы получить символы для определенного адреса памяти из определенного файла символов. Следующий ответ показывает, как это сделать: fooobar.com/questions/16908/...
В качестве альтернативы вы можете использовать symbolicatecrash.pl
script, который поставляется с Xcode и принимает стандартный отформатированный отчет о сбоях Apple (у PLCrashReporter есть инструмент преобразования для создания таких отчетов из более компактных отчетов).