Xcode не показывает строку, которая вызывает сбой - PullRequest
117 голосов
/ 09 октября 2011

Каждый раз, когда происходит сбой моего приложения, XCode выделяет вызов UIApicationMain () в функции main () как строку, вызвавшую сбой.В некоторых случаях это было нормально (например, ошибка сегментации), но сбой, с которым я пытаюсь справиться, - это простой SIGABRT с подробной информацией, записанной в консоли:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'

Xcode, используемый для отображения строкикак раз со старыми SDK, но с тех пор, как я обновился до Xocde 4.2, это изменилось.Совершенно очевидно, что XCode точно знает, что вызвало сбой (или мог знать), но он все еще не показывает фактическую строку.Есть ли какое-либо исправление или обходной путь для этого?

Ответы [ 5 ]

288 голосов
/ 09 октября 2011

Вы также должны убедиться, что у вас установлены точки останова для всех исключений. Это заставит XCode остановиться на линии, где происходит исключение. Сделайте следующее [в Xcode 4]:

  1. В Project Navigator в левой части XCode, нажмите на навигатор точек останова (почти до правой стороны верхней панели кнопок. Значок выглядит как жирная стрелка вправо).

  2. В нижней части навигатора нажмите кнопку «+».

  3. Нажмите «Добавить точку останова исключения».

  4. Будет создана новая точка останова. Он должен быть настроен по мере необходимости, но вы можете настроить его поведение.

  5. Запустите ваш проект и воспроизведите исключение.

Также вы упомянули, что вы ссылались на некоторые сторонние библиотеки / фреймворки. Если исключение происходит в этих структурах, то вам будет трудно, так как код скомпилирован, и XCode не может фактически показать вам строку, которая вызвала исключение. Если дело обстоит именно так, и вы уверены, что используете библиотеки правильно, вы должны отправить отчет об ошибке сопровождающим этих библиотек.

20 голосов
/ 02 мая 2016

Просто следуйте инструкциям на этот ответ StackOverflow:

Включить зомби

По сути, вам просто нужно "Включить зомби". Тогда Xcode должен прерваться в зависимости от того, какая строка вызвала проблему.

enter image description here

(Абсолютно шокирует, что даже в 2017 году Xcode по-прежнему отключает эту функцию по умолчанию. Почему бы вам не захотелось бы увидеть строку, вызвавшую проблему? И " Включить зомби Objects"?! Действительно?! Действительно ли авторы Xcode считают, что это полезное имя, которое имело бы какой-то смысл для новых разработчиков? Удручает то, насколько плохой рейтинг Xcode год за годом в приложении. Магазин. Никто не слушает ...)

8 голосов
/ 10 октября 2011

Измените текущую схему и включите NSZombieEnabled, MallocStackLogging и guard malloc.Затем, когда произойдет сбой вашего приложения, введите его в консоли gdb:

(gdb) info malloc-history 0x543216

Замените 0x543216 адресом объекта, вызвавшего NSInvalidArgumentException, и он должен дать вам гораздо более полезную трассировку стека, показывая строки вашего кода, которые вызывают сбой.

2 голосов
/ 10 октября 2011

Я видел такое поведение в сильно оптимизированном коде;проверка, настройка уровня оптимизации вашей цели и сторонних библиотек может помочь.(Настройка уровня оптимизации LLVM 3.0)

Вы генерируете символы отладки?

0 голосов
/ 07 января 2017

Я написал код для генерации сбоя индекса вне пределов. Ниже приводится исключение.

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e85cd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010e2be21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
    3   testABC                             0x000000010dce962d -[ViewController ComplexFunction] + 61
    4   testABC                             0x000000010dce95db -[ViewController thirdFunction] + 43
    5   testABC                             0x000000010dce959b -[ViewController secondFunction] + 43
    6   testABC                             0x000000010dce955b -[ViewController firstFinction] + 43
    7   testABC                             0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
    8   UIKit                               0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
    9   UIKit                               0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
    10  UIKit                               0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
    11  UIKit                               0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
    12  UIKit                               0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
    13  UIKit                               0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
    14  CoreFoundation                      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    15  CoreFoundation                      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
    16  CoreFoundation                      0x000000010e7e5e65 __CFRunLoopRun + 901
    17  CoreFoundation                      0x000000010e7e5884 CFRunLoopRunSpecific + 420
    18  GraphicsServices                    0x00000001126d9a6f GSEventRunModal + 161
    19  UIKit                               0x000000010ec80c68 UIApplicationMain + 159
    20  testABC                             0x000000010dce99df main + 111
    21  libdyld.dylib                       0x000000011174968d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Если внимательно прочитать First Throw call stack

0   CoreFoundation              0x000000010e85cd4b __exceptionPreprocess + 171
1   libobjc.A.dylib             0x000000010e2be21e objc_exception_throw + 48

0 and 1 - системные процессы после сбоя.

 2   CoreFoundation             0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111

2 - строка, вызвавшая исключение.

3   testABC                     0x000000010dce962d -[ViewController ComplexFunction] + 61

3 сообщает вам, что имя класса (ViewController) и функция naem (ComplexFunction) были выброшены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...