Точка останова исключения XCode не печатает детали создаваемого исключения
РЕЗЮМЕ
Когда я устанавливаю точку останова исключения, я не получаю сообщение об исключении. Как получить сообщение об исключении? Я уже знаю, как получить трассировку стека, но это не включает сообщение об исключении.
ПОДРОБНОСТИ
В прошлом я разрабатывал приложения для iOS с XCode, и когда возникала проблема, я получал ошибку / исключение. Исключение часто будет содержать сообщение типа "не может разыменовать нуль" или что-то еще.
Теперь, используя Xcode 4.6.x за последние несколько недель, я никогда не получал сообщения об исключении. Я часто получаю SIGABRT. Я установил разрыв на точку останова исключения, и он сломается там, но он отключен в некоторой сборке в iOS SDK, и я никогда не получаю сообщение.
На самом деле, я не могу вспомнить, когда в последний раз я видел, как что-то появлялось в консоли отладчика.
Исчезла ли информация об исключении при переходе на LLVM?
Очень неприятно, что мое приложение просто падает в SDK, не зная почему. Я проверяю последнюю функцию, чтобы убедиться, что все настроено правильно (объекты выделены и т. Д.), И это означает, что у меня нет никаких подсказок.
Возможно ли, что настройка сборки, перенесенная из прошлого, как-то отключает сообщения об исключениях?
Пожалуйста, снова откройте вопрос. Теперь у него есть ответ!
В комментариях был дан отличный ответ. Это должно быть сделано для полного ответа, и поэтому я могу отметить ответ на вопрос, и другие, у кого есть эта общая проблема, могут найти его. Для того чтобы это произошло, вопрос должен быть вновь открыт! (Я удалю эту просьбу после того, как это произойдет.)
5 ответов
Я обновлю ответ Джеффа здесь:
Чтобы обе строки, вызывающие исключение, были выделены (а не UIApplicationMain() в main.m) И чтобы увидеть причину исключения (например, "ошибка: запрос на выборку должен иметь сущность."), Сделайте следующее:
- В навигаторе точек останова:
- Добавить (+), Добавить исключительную точку останова
- Выберите новую точку останова, Control-Click, Изменить точку останова
- Добавить действие
- Введите: po $ arg1
Соответствующая часть трассировки стека будет находиться в области навигатора.
Это, кажется, все еще работает в Xcode 9
Вот мое дополнение для использования с Xcode 6 и ниже.
- Введите: po (NSException *) $ eax
В Xcode 6 вы должны явно предоставить тип объекта, потому что он больше не выводится.
Для Xcode 7-9 (основываясь на ответе Джеффа):
В навигаторе точек останова:
- Добавить (+), Добавить исключительную точку останова
- Выберите новую точку останова, Control-Click, Изменить точку останова
- Добавить действие
- Войти:
po $arg1
Чтобы обе строки, вызывающие исключение, были выделены (а не UIApplicationMain() в main.m) И чтобы увидеть причину исключения (например, "ошибка: запрос на выборку должен иметь сущность."), Сделайте следующее:
- В навигаторе точек останова:
- Добавить (+), Добавить исключительную точку останова
- Выберите новую точку останова, Contorl-Click, Изменить точку останова
- Добавить действие
- Введите: po $ eax
Соответствующая часть трассировки стека будет находиться в области навигатора.
Да, xcode не очень удобен для отладки. Мне нравится эта статья, в которой я немного разбираюсь в журналах сбоев)) Демистификация журналов сбоев приложений iOS
Также сделайте это, если вы видите сообщение об ошибке "сообщение отправлено освобожденному экземпляру"
"Продукты -> Редактировать схему -> Включить объекты зомби"
это активирует объекты-зомби, и когда вы делаете профиль для своего проекта, выбираете "зомби", вызываете ошибку, и вы сможете увидеть, какие объекты были освобождены, например, NSArray *myArray
Информация, которую я получаю от po $eax
или же po (NSException *)$eax
кажется, отличается от того, что напечатал бы Xcode, если не установлены точки останова исключения. Поэтому я делаю следующее,
- Добавить точку останова исключения
- Исключение происходит, точка останова была достигнута -> Я знаю местоположение
- Временно отключите точки останова (вторая кнопка слева в области отладки)
- Продолжить выполнение программы (третья кнопка слева в области отладки)
- Подробности печатаются -> Я знаю причину
Очевидно, не очень элегантно и гибко, но, по крайней мере, я ответил на два больших вопроса (где и почему).
Вы можете использовать bt
или thread backtrace
команда для печати трассировки ошибки
Показать трассировку стека для текущего потока.
Та же трассировка стека, которую вы можете найти в отчетах о сбоях
Информация об использовании текущего потока currentThread
//Objective-C
po [NSThread currentThread]
//Swift
po Thread.currentThread