Каждый раз, когда в моем приложении происходит сбой, 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 точно знает, что вызвало сбой (или мог знать), но все еще не показывает фактическую строку. Есть ли какое-нибудь исправление или обходной путь для этого?
Ответы:
Вы также должны убедиться, что у вас установлены точки останова для всех исключений. Это заставит Xcode остановиться на строке, где возникает исключение. Сделайте следующее [в Xcode 4]:
В навигаторе проекта в левой части Xcode щелкните навигатор точки останова (почти полностью до правой стороны верхней панели кнопок. Значок выглядит как толстая стрелка вправо).
Внизу навигатора нажмите кнопку «+».
Щелкните «Добавить исключительную точку останова».
Будет создана новая точка останова. Его следует настроить по мере необходимости, но вы можете настроить его поведение.
Запустите свой проект и воспроизведите исключение.
Также вы упомянули, что связались с некоторыми сторонними библиотеками / фреймворками. Если исключение возникает в этих фреймворках, вам придется нелегко, поскольку код скомпилирован, и Xcode не может фактически показать вам строку, вызвавшую исключение. Если это так, и вы уверены, что используете библиотеки правильно, вам следует отправить отчет об ошибке разработчикам этих библиотек.
источник
Просто следуйте инструкциям в этом ответе StackOverflow:
Включить зомби
По сути, вам просто нужно «Включить зомби». Тогда Xcode должен сломаться в той строке, которая вызвала проблему.
(Абсолютно шокирует то, что даже в 2017 году Xcode по-прежнему отключил это по умолчанию. Почему вы не хотите видеть строку, вызвавшую проблему? И « Включить объекты зомби »?! Действительно?! Неужели авторы Xcode действительно Считаете, что это полезное имя, которое имело бы какой-либо смысл для новых разработчиков? Удручает, насколько низкий рейтинг Xcode из года в год в App Store. Никто не слушает ...)
источник
Изменить текущую схему и включить
NSZombieEnabled
,MallocStackLogging
иguard malloc
. Затем, когда ваше приложение выйдет из строя, введите это в консоли gdb:Замените
0x543216
адресом объекта, который вызвалNSInvalidArgumentException
сбой, и он должен дать вам гораздо более полезную трассировку стека, показывая строки вашего кода, которые вызывают сбой.источник
Я видел такое поведение в сильно оптимизированном коде; проверка, настройка уровня оптимизации вашей цели и сторонних библиотек может помочь. (Настройка уровня оптимизации LLVM 3.0)
Вы генерируете символы отладки?
источник
Я написал код для генерации сбоя индекса при выходе за пределы. Ниже приведено исключение.
Если вы внимательно прочитаете
First Throw call stack
0 and 1
системные процессы после сбоя.2
строка, вызвавшая исключение.3
сообщает вам, что имя класса (ViewController
) и функция naem (ComplexFunction
), в которой было сгенерировано исключение.источник