Типы исключений в журналах сбоев iOS - PullRequest
49 голосов
/ 16 сентября 2011

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

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

, но не знаю о:
Тип исключения: EXC_BAD_ACCESS (SIGBUS)
Тип исключения: EXC_CRASH (SIGABRT)
Тип исключения: EXC_BREAKPOINT (SIGTRAP)

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

Ответы [ 4 ]

96 голосов
/ 16 сентября 2011

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

Нет.

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

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

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

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

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

Тем не менее, для возобновления:

SIGSEGV (ошибка сегментации)

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

SIGBUS (ошибка шины)

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

SIGFPE (исключение с плавающей запятой)

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

SIGPIPE

Разбитая труба.

SIGILL

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

SIGTRAP

Отладчик связан

SIGABRT

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

29 голосов
/ 16 сентября 2011

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 и NSException не пойманы.Если вы получаете SIGABRT, вы сделали что-то не так, что обнаруживается системным программным обеспечением (в отличие от SEGV и BUS, которые возникают в аппаратном обеспечении).

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

4 голосов
/ 16 сентября 2011

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

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

1 голос
/ 25 сентября 2018

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

EXC_BAD_ACCESS (SIGSEGV) или EXC_BAD_ACCESS (SIGBUS)

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

EXC_BREAKPOINT (SIGTRAP)

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

EXC_BAD_INSTRUCTION (SIGILL)

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

EXC_GUARD

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

...