Типы исключений в журналах сбоев iOS

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

Я знаю, что: тип исключения: exc_bad_access и (сигнала SIGSEGV) означает, что мы обращаемся к освобожденному объекту.

но не знаю:
тип исключения: exc_bad_access и (платформе ARM)
тип исключения: EXC_CRASH (SIGABRT)
тип исключения: EXC_BREAKPOINT (SIGTRAP)

вы знаете, сколько Типы исключений в журналах сбоев iOS и что они означают?

4 ответов


Я знаю, что: тип исключения: EXC_BAD_ACCESS (SIGSEGV) означает, что мы обращаемся к освобожденному объекту.

нет.

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

эти исключения (фактически, они являются сигналами) не связаны с Objective-C, но C. Таким образом, вы можете получить такое исключение без объектов Objective-C.

обратите внимание, что сигнал не является исключением, то есть вы не можете поймать их с @try и @catch блоки.

вы можете установить обработчик сигнала с signal и sigaction функции. Имейте в виду, что некоторые сигналы, такие как SIGABRT, не могут быть заблокированы.

вы можете проверить Википедия страница о сигналах, если вы хотите больше информации.

, который сказал, чтобы возобновить:

сигнала SIGSEGV (ошибка сегментирования)

доступ к недопустимой памяти адрес. Адрес существует, но ваша программа не имеет к нему доступа.

платформе ARM (ошибка шины)

доступ к недопустимому адресу памяти. Адрес не существует или выравнивание недопустимо.

сигнала sigfpe (с плавающей запятой)

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

сигнал sigpipe,

сломанной трубы.

SIGILL

недопустимая инструкция процессора.

обработчик SIGTRAP

отладчика, связанные

по сигналу sigabrt

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


SIGSEGV буквально означает, что вы получаете доступ к адресу, который вам не принадлежит. Таким образом, вы не обязательно получаете доступ к освобожденному объекту; вы можете получить доступ к объекту, который никогда не существовал, как в:

UIView *view; // uninitialised, could point to anything
[view setFrame:someFrame];

или даже просто делает ошибку в необъектных вещах уровня C, таких как:

int array[100];
array[1000] = 23; // out-of-bounds access

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

если вы пытаетесь сопоставить ошибки, которые вы, вероятно, сделали в Objective-C, вы, вероятно, просто хотите прочитать SIGSEGV и SIGBUS вместе, что означает "доступ к памяти, который я не имел права делать".

по сигналу sigabrt-это программа пытается прервать себя, поэтому обычно это означает, что какая-то внутренняя проверка согласованности не удалась. Например, SIGABRT поднимается, если вы пытаетесь освободить одну и ту же память дважды, или - на уровне какао - если вы raise an NSException, что не поймали. Если вы получаете SIGABRT, вы сделали что-то неправильно, что обнаружено системным программным обеспечением (в отличие от SEGV и шины, которые возникают в аппаратном обеспечении).

SIGTRAP-это вызов из программы к отладчику. Анекдотично, Яблоко кажется, они используются, когда вы делаете что-то неправильно, что может быть обнаружено в программном обеспечении, но относится к среде, а не к вашему конкретному коду. Так, например, вы вызываете функцию C, которая существует в SDK, который вы создали, но не на устройстве, на котором вы работаете (например, когда вы строите с последним SDK с более низкой целью развертывания), или делаете аналогичную вещь с объектом.


эти сообщения от gdb, и они не являются исключительными для objective-C. Чтобы получить информацию о сигналах, все, что вам нужно сделать, это ввести info signals в консоли отладчика, это пример вывода. Извините, что не разместил его здесь, но формат вывода консоли ужасен.

источник и дополнительная информация о сигналах


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

EXC_BAD_ACCESS (SIGSEGV) или EXC_BAD_ACCESS (SIGBUS)

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

EXC_BREAKPOINT (SIGTRAP)

это связано с NSException поднимается (возможно, библиотекой от нашего имени) или _NSLockError или objc_exception_throw называют. Например, это может быть среда Swift, обнаруживающая аномалию, такую как принудительное разворачивание нуля.

EXC_BAD_INSTRUCTION (SIGILL)

это когда сам программный код неисправен, а не память, к которой он может получить доступ. Это должно быть редко на устройствах iOS; возможно, ошибка компилятора или оптимизатора или неисправный ручной код сборки. На симуляторе это другая история, поскольку использование неопределенного кода операции-это метод, используемый средой выполнения Swift для остановки доступа к объектам зомби (освобожденным объекты.)

EXC_GUARD

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