Точка исключения исключений Xcode не печатает сведения об исключении
РЕЗЮМЕ
Когда я устанавливаю контрольную точку исключения, я не получаю сообщение об исключении. Как получить сообщение об исключении? Я уже знаю, как получить трассировку стека, но это не включает сообщение об исключении.
ПОДРОБНОСТИ
В прошлом я разработал приложения iOS с Xcode, и когда возникла проблема, я получил бы ошибку/исключение. В исключении часто бывало сообщение типа "невозможно разыменовать нуль" или что-то еще.
Теперь, используя Xcode 4.6.x за последние несколько недель, я никогда не получал сообщение об исключении. Я часто получаю SIGABRT. Я вложил в break на контрольную точку исключения, и он сломается там, но это произойдет в некоторой сборке в SDK iOS, и я никогда не получаю сообщение.
На самом деле, я не могу вспомнить последний раз, когда я увидел, что что-то появилось в консоли отладчика.
Неужели информация об исключении исчезла с переходом на LLVM?
Очень жаль, что мое приложение просто врезалось в SDK, не зная почему. Я проверяю последнюю функцию, чтобы убедиться, что все правильно настроено (выделены объекты и т.д.), И это значит, что я не оставил никаких подсказок.
Возможно ли, что настройка сборки, перенесенная из прошлого, как-то отключает сообщения об исключениях?
Пожалуйста, откройте вопрос. Теперь у него есть ответ!
В комментариях был дан отличный ответ. Это должно быть доведено до полного ответа, и поэтому я могу отметить ответ на этот вопрос, и другие, у кого эта общая проблема, могут его найти. Чтобы это произошло, вопрос нужно вновь открыть! (Я удалю эту просьбу после этого.)
Ответы
Ответ 1
Я обновлю ответ Джеффа здесь:
Чтобы иметь строку , вызывающую выделенное исключение (а не UIApplicationMain() в main.m) И чтобы увидеть причину исключения (например, "error: Запрос на выборку должен иметь объект." ), Выполните следующее:
- В навигаторе Breakpoint:
- Добавить (+), Добавить точку останова исключений
- Выберите новую точку останова, Contorl-Click, Edit Breakpoint
- Добавить действие
- Введите: po $eax
Соответствующая часть трассировки стека будет находиться в области nagivator.
Вот мое дополнение для использования с Xcode 6.
- Введите: po (NSException *) $eax
В Xcode 6 вы должны явно указать тип объекта, потому что он больше не выводится.
Использование po $arg1 теперь лучше работает в Xcode 7 и выше, поскольку оно не зависит от архитектуры.
Ответ 2
Для Xcode 7 и 8 (на основе ответа Джеффа):
В навигаторе точки останова:
- Добавить (+), Добавить точку останова исключений
- Выберите новую точку останова, Control-Click, Edit Breakpoint
- Добавить действие
- Введите:
po $arg1
Ответ 3
Чтобы иметь строку , вызывающую выделенное исключение (а не UIApplicationMain() в main.m) И чтобы увидеть причину исключения (например, "error: Запрос на выборку должен иметь объект." ), Выполните следующее:
- В навигаторе Breakpoint:
- Добавить (+), Добавить точку останова исключений
- Выберите новую точку останова, Contorl-Click, Edit Breakpoint
- Добавить действие
- Введите: po $eax
Соответствующая часть трассировки стека будет находиться в области nagivator.
Ответ 4
Да, xcode не очень дружелюбен для отладки. Мне нравится эта статья, которая помогает мне понять краш-журналы немного ясно))
Демистификация журналов сбоев приложений iOS
Также сделайте это, если вы видите сообщение об ошибке "отправлено на освобожденный экземпляр"
'Продукты → Изменить схему → Включить объекты зомби
это позволит объекты зомби, а когда вы делаете профиль в свой проект, выберите
"zombie", вызывают ошибку, и вы сможете увидеть, какие объекты были освобождены, например NSArray * myArray
Ответ 5
Информация, полученная от po $eax
или po (NSException *)$eax
, по-видимому, отличается от того, что Xcode будет печатать, если не установлены контрольные точки исключения. Поэтому я делаю следующее:
- Добавить контрольную точку исключения
- Исключение происходит, точка останова была удалена → Я знаю местоположение
- Временно отключить контрольные точки (вторая кнопка слева в области отладки)
- Продолжить выполнение программы (третья кнопка слева в области отладки)
- Подробности печатаются → Я знаю причину
Очевидно, что это не очень элегантно и гибко, но, по крайней мере, я отвечаю на два больших вопроса (где и почему).