iOS
Отладка сбоев
Поиск…
Поиск информации о сбое
Когда ваше приложение выйдет из строя, Xcode войдет в отладчик и покажет вам больше информации о сбое:
Наиболее важными являются:
Красная стрелка
Красная стрелка показывает, какая строка кода разбилась и почему она разбилась.
Консоль отладчика
Многие сбои регистрируют дополнительную информацию на консоли отладчика. Он должен появляться автоматически, когда приложение выходит из строя, но если его нет, покажите отладчик, выбрав в правом верхнем углу Xcode и покажите консоль, нажав в нижнем правом углу отладчика.
Трассировка стека
Трассировка стека перечисляет функции, которые программа пришла, прежде чем она попала в поврежденный код.
Часть трассировки стека отображается в навигаторе отладки в левой части экрана, а элементы отладчика позволяют выбрать фрейм стека для просмотра в отладчике:
Если вы вводите команду bt
в (lldb)
в отладчике и нажимаете return , вы получите текстовое представление трассировки стека, которое вы можете скопировать и вставить:
(lldb) bt
* thread #1: tid = 0x3aaec5, 0x00007fff91055f06 libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x00007fff91055f06 libsystem_kernel.dylib`__pthread_kill + 10
frame #1: 0x000000010008142d libsystem_pthread.dylib`pthread_kill + 90
frame #2: 0x00007fff96dc76e7 libsystem_c.dylib`abort + 129
frame #3: 0x00007fff8973bf81 libc++abi.dylib`abort_message + 257
frame #4: 0x00007fff89761a47 libc++abi.dylib`default_terminate_handler() + 267
frame #5: 0x00007fff94f636ae libobjc.A.dylib`_objc_terminate() + 103
frame #6: 0x00007fff8975f19e libc++abi.dylib`std::__terminate(void (*)()) + 8
frame #7: 0x00007fff8975ec12 libc++abi.dylib`__cxa_throw + 121
frame #8: 0x00007fff94f6108c libobjc.A.dylib`objc_exception_throw + 318
frame #9: 0x00007fff8d067372 CoreFoundation`-[__NSPlaceholderArray initWithObjects:count:] + 290
frame #10: 0x00007fff8d0eaa1f CoreFoundation`+[NSArray arrayWithObject:] + 47
* frame #11: 0x0000000100001b54 test`main(argc=1, argv=0x00007fff5fbff808) + 68 at main.m:15
frame #12: 0x00007fff8bea05ad libdyld.dylib`start + 1
frame #13: 0x00007fff8bea05ad libdyld.dylib`start + 1
Отладка сбоев SIGABRT и EXC_BAD_INSTRUCTION
SIGABRT
или EXC_BAD_INSTRUCTION обычно означает, что приложение разбилось само намеренно, потому что некоторая проверка завершилась неудачно. Они должны записать сообщение на консоль отладчика с дополнительной информацией; проверьте там дополнительную информацию.
Многие SIGABRT
вызваны неотображаемыми исключениями Objective-C. Существует множество причин, по которым могут быть исключены исключения, и они всегда будут записывать на консоль много полезной информации.
-
NSInvalidArgumentException
, что означает, что приложение передало недопустимый аргумент методу -
NSRangeException
, что означает, что приложение попыталось получить доступ к индексу вне пределов объекта, напримерNSArray
илиNSString
-
NSInternalInconsistencyException
означает, что объект обнаружен в неожиданном состоянии. -
NSUnknownKeyException
обычно означает, что у вас плохое соединение в XIB. Попробуйте некоторые ответы на этот вопрос .
Отладка EXC_BAD_ACCESS
EXC_BAD_ACCESS
означает, что процесс пытался получить доступ к памяти недействительным способом, например разыменование указателя NULL
или запись в постоянную память. Это самый трудный вид сбоя для отладки, потому что он обычно не имеет сообщения об ошибке, и некоторые сбои могут быть очень трудными для воспроизведения и / или встречаются в коде, полностью не связанном с проблемой. Эта ошибка встречается очень редко в Swift, но если это происходит, вы можете часто получать более легкие отладки, уменьшая оптимизацию компилятора.
Большинство ошибок EXC_BAD_ACCESS
вызваны попыткой разыменовать указатель NULL
. Если это так, адрес, указанный в красной стрелке, обычно будет шестнадцатеричным числом, которое ниже обычного адреса памяти, часто 0x0
. Установите контрольные точки в отладчике или добавьте случайные инструкции printf
/ NSLog
чтобы узнать, почему этот указатель имеет NULL
.
EXC_BAD_ACCESS
который происходит менее надежно или вообще не имеет смысла, может быть результатом проблемы управления памятью. Общие проблемы, которые могут вызвать это:
- Использование памяти, которая была освобождена
- Попытка написать за конец массива C или другого типа буфера
- Использование указателя, который не был инициализирован
В разделе «Диагностика» редактора схем Xcode содержит несколько полезных инструментов для устранения проблем с памятью:
Адрес Sanitizer добавляет множество проверок, которые остановят приложение, когда возникнут проблемы с памятью, и предоставит полезное сообщение об ошибке, подробно описывающее, что произошло. Объекты Zombie обнаруживают проблемы с освобожденными объектами Objective-C, но вы не должны получать эти проблемы с включенным автоматическим подсчетом ссылок.