Типы исключений в журналах сбоев iOS
Я видел несколько разных типов журналов сбоев, так как я начал изучать разработку iOS.
Я знаю, что:
Тип исключения: EXC_BAD_ACCESS (SIGSEGV) означает, что мы обращаемся к выпущенному объекту.
но не знаю о:
Тип исключения: EXC_BAD_ACCESS (SIGBUS)
Тип исключения: EXC_CRASH (SIGABRT)
Тип исключения: EXC_BREAKPOINT (SIGTRAP)
Знаете ли вы, сколько типов исключений в журналах сбоев iOS и что они означают?
Ответы
Ответ 1
Я знаю, что: Тип исключения: EXC_BAD_ACCESS (SIGSEGV) означает, что мы обращаемся к выпущенному объекту.
Нет.
A SIGSEGV - это ошибка сегментации, то есть вы пытаетесь получить доступ к недопустимому адресу памяти.
Эти исключения (фактически, они являются сигналами) не связаны с Objective-C, но C.
Таким образом, вы можете получить такое исключение без Objective-C объектов.
Обратите внимание, что сигнал не является исключением, то есть вы не можете поймать их с помощью блоков @try
и @catch
.
Вы можете установить обработчик сигналов с функциями signal
и sigaction
. Имейте в виду, что некоторые сигналы, такие как SIGABRT, не могут быть заблокированы.
Вы можете проверить Wikipedia страницу о сигналах, если вам нужна дополнительная информация.
Тем не менее, для возобновления:
SIGSEGV (ошибка сегментации)
Доступ к недопустимому адресу памяти. Адрес существует, но ваша программа не имеет к нему доступа.
SIGBUS (ошибка шины)
Доступ к недопустимому адресу памяти. Адрес не существует, или выравнивание недействительно.
SIGFPE (исключение с плавающей запятой)
Неверная арифметическая операция. Может быть связано с целыми операциями, несмотря на название.
Сломанная труба.
Недопустимая инструкция процессора.
Отладчик, связанный
Авария программы, не связанная с одним из предыдущих сигналов.
Ответ 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
на консоли отладчика, это пример вывода. Извините, что не размещал его здесь, но формат вывода на консоль ужасен.
Источник и дополнительная информация о сигналах