Подтвердить что ты не робот

Точка исключения исключений Xcode не печатает сведения об исключении

РЕЗЮМЕ

Когда я устанавливаю контрольную точку исключения, я не получаю сообщение об исключении. Как получить сообщение об исключении? Я уже знаю, как получить трассировку стека, но это не включает сообщение об исключении.

ПОДРОБНОСТИ

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

Теперь, используя Xcode 4.6.x за последние несколько недель, я никогда не получал сообщение об исключении. Я часто получаю SIGABRT. Я вложил в break на контрольную точку исключения, и он сломается там, но это произойдет в некоторой сборке в SDK iOS, и я никогда не получаю сообщение.

На самом деле, я не могу вспомнить последний раз, когда я увидел, что что-то появилось в консоли отладчика.

Неужели информация об исключении исчезла с переходом на LLVM?

Очень жаль, что мое приложение просто врезалось в SDK, не зная почему. Я проверяю последнюю функцию, чтобы убедиться, что все правильно настроено (выделены объекты и т.д.), И это значит, что я не оставил никаких подсказок.

Возможно ли, что настройка сборки, перенесенная из прошлого, как-то отключает сообщения об исключениях?

Пожалуйста, откройте вопрос. Теперь у него есть ответ!

В комментариях был дан отличный ответ. Это должно быть доведено до полного ответа, и поэтому я могу отметить ответ на этот вопрос, и другие, у кого эта общая проблема, могут его найти. Чтобы это произошло, вопрос нужно вновь открыть! (Я удалю эту просьбу после этого.)

4b9b3361

Ответ 1

Я обновлю ответ Джеффа здесь:

Чтобы иметь строку , вызывающую выделенное исключение (а не UIApplicationMain() в main.m) И чтобы увидеть причину исключения (например, "error: Запрос на выборку должен иметь объект." ), Выполните следующее:

  • В навигаторе Breakpoint:
    • Добавить (+), Добавить точку останова исключений
    • Выберите новую точку останова, Contorl-Click, Edit Breakpoint
    • Добавить действие
    • Введите: po $eax

Соответствующая часть трассировки стека будет находиться в области nagivator.

Вот мое дополнение для использования с Xcode 6.

  1. Введите: 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 будет печатать, если не установлены контрольные точки исключения. Поэтому я делаю следующее:

  • Добавить контрольную точку исключения
  • Исключение происходит, точка останова была удалена → Я знаю местоположение
  • Временно отключить контрольные точки (вторая кнопка слева в области отладки)
  • Продолжить выполнение программы (третья кнопка слева в области отладки)
  • Подробности печатаются → Я знаю причину

Очевидно, что это не очень элегантно и гибко, но, по крайней мере, я отвечаю на два больших вопроса (где и почему).