Поиск…


Поиск информации о сбое

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow