Типы исключений в журналах сбоев 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, используемая системой.