Точка останова исключения XCode не печатает детали создаваемого исключения

РЕЗЮМЕ

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

ПОДРОБНОСТИ

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

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

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

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

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

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

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

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

5 ответов

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

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

  • В навигаторе точек останова:
    1. Добавить (+), Добавить исключительную точку останова
    2. Выберите новую точку останова, Control-Click, Изменить точку останова
    3. Добавить действие
    4. Введите: po $ arg1

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

Это, кажется, все еще работает в Xcode 9

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

  1. Введите: po (NSException *) $ eax

В Xcode 6 вы должны явно предоставить тип объекта, потому что он больше не выводится.

Для Xcode 7-9 (основываясь на ответе Джеффа):

В навигаторе точек останова:

  1. Добавить (+), Добавить исключительную точку останова
  2. Выберите новую точку останова, Control-Click, Изменить точку останова
  3. Добавить действие
  4. Войти: po $arg1

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

  • В навигаторе точек останова:
    1. Добавить (+), Добавить исключительную точку останова
    2. Выберите новую точку останова, Contorl-Click, Изменить точку останова
    3. Добавить действие
    4. Введите: po $ eax

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

Да, xcode не очень удобен для отладки. Мне нравится эта статья, в которой я немного разбираюсь в журналах сбоев)) Демистификация журналов сбоев приложений iOS

Также сделайте это, если вы видите сообщение об ошибке "сообщение отправлено освобожденному экземпляру"

"Продукты -> Редактировать схему -> Включить объекты зомби"

это активирует объекты-зомби, и когда вы делаете профиль для своего проекта, выбираете "зомби", вызываете ошибку, и вы сможете увидеть, какие объекты были освобождены, например, NSArray *myArray

Информация, которую я получаю от po $eax или же po (NSException *)$eax кажется, отличается от того, что напечатал бы Xcode, если не установлены точки останова исключения. Поэтому я делаю следующее,

  1. Добавить точку останова исключения
  2. Исключение происходит, точка останова была достигнута -> Я знаю местоположение
  3. Временно отключите точки останова (вторая кнопка слева в области отладки)
  4. Продолжить выполнение программы (третья кнопка слева в области отладки)
  5. Подробности печатаются -> Я знаю причину

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

Вы можете использовать bt или thread backtrace команда для печати трассировки ошибки

Показать трассировку стека для текущего потока.

Та же трассировка стека, которую вы можете найти в отчетах о сбоях

Информация об использовании текущего потока currentThread

//Objective-C
po [NSThread currentThread]

//Swift
po Thread.currentThread
Другие вопросы по тегам