Типы исключений в журналах сбоев iOS - программирование
Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Нет.

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

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

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

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

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

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

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

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

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

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

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

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

SIGPIPE

Сломанная труба.

SIGILL

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

SIGTRAP

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

SIGABRT

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

Ответ 2

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

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

Ответ 3

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

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