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

Xcode выдает исключение в Main() в iOS 8 с точкой останова "все исключения"

Я использую Xcode 6 (GM, я не загружал бета), и я разрабатываю приложения для iOS 7+. Для всех моих проектов я только что открыл те же проекты, что и раньше, в Xcode 5.

В навигаторе Breakpoint я включил точку останова All Exceptions. Он установлен на Break: On Throw. Теперь, каждый раз, когда я запускаю свое приложение (будь то на устройстве или в симуляторе), он останавливает выполнение в строке return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); в функции main().

Если я нажму Play, чтобы продолжить выполнение программы дважды, программа работает нормально. Таким образом, это не мешает мне работать, но мне все равно придется вручную выполнять выполнение каждого раза и reset мои редакторы.

Мне нравятся поведение, которое я установил в Xcode (перенос текущего редактора туда, где выполнение приостановлено), и наличие этой точки останова All Exceptions является важным IMO. (Поэтому я не хочу их менять)

Запустив тот же код, с теми же средами, для iOS 7 target (опять же, устройства или симулятора), исключение не выбрасывается.

Можно ли понять, что может вызвать это странное поведение?

4b9b3361

Ответ 1

Как указано в комментариях, вы должны отключить перехват исключений С++, отредактировав точку останова All Exceptions.

Чтобы сделать это, щелкните правой кнопкой мыши на точке останова и измените Исключение из Все на Objective-C:

change All to Objective-C

Исключения в коде С++ являются частью нормальной функциональности приложения. Тем не менее, контрольная точка исключения не захватывает необработанные, но все возникающие исключения, даже когда они обрабатываются правильно позже, следовательно, остановка в выполнении.

Ответ 2

TL;DR; В моем случае причиной проблемы были отсутствующие шрифты.

У меня также была эта проблема. В то время как @Johnnywho прав, оставляя точку исключения Exception только для Objective-C, останавливает нежелательное поведение, она по-прежнему не объясняет, что является реальной причиной, почему она запускается без исключения на iOS7 и почему это происходит только в некоторых проектах.

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

Быстрый способ протестировать его:

  • Запустите новый проект с одним представлением

  • Включить точку останова во всех исключениях, включая С++ (Breakpoints/+/Add Exception Breakpoint)

  • Перетащите в проект некоторый пользовательский шрифт (разрешите копирование и проверьте цель, чтобы добавить его)

  • Добавить метку в представление в главном контроллере представления

  • Выберите собственный шрифт для вашей метки (на Xcode 6+ он должен отображаться в подборщике шрифтов, как только вы перетащите его в проект).

  • Запустите приложение и подтвердите, что вы видите метку в своем пользовательском шрифте (кажется, нам больше не нужно добавлять имя файла шрифта в Info.plist для ключа "Шрифты, предоставленные приложением", если пользовательский шрифт использовался в раскадровке xib приложения).

  • Теперь удалите пользовательский шрифт из вашего проекта (либо путем удаления целевого отношения, либо удалив его в целевых настройках /Build Phases/Copy Bundle Resources)

  • Удалите приложение с вашего устройства или сима (чтобы удалить файл шрифта из пакета приложений)

  • Продукт/Очистка

  • Запустите приложение еще раз (теперь у метки все еще есть ссылка на пользовательский шрифт, но приложение не имеет для него файла). Вы должны заметить загадочное исключение, если вы запустите iOS8.

  • Запустите приложение на устройстве с iOS7 или sim с iOS7 (для этого вам нужно будет изменить iOS для iOS7). Хотя на ярлыке не отображается пользовательский шрифт, исключений не будет.

  • Добавьте файл шрифта обратно к цели, и точка останова больше не останавливается.

Итак, мой вывод заключается в том, что на iOS8 недостающие шрифты вызывают исключение С++, а на iOS7 они нет, поэтому триггер точки останова.

Аналогичное исключение (и триггер точки останова) также может быть вызвано неправильно написанным именем файла шрифта в файле Info.plist под ключом "Шрифты, предоставляемые приложением".

Ответ 3

Просто подытожил предыдущие ответы, которые помогли мне исправить это.

Проблема. Когда вы добавляете собственный шрифт и затем, по-видимому, удаляете (заменяете) его, где-то в проекте все еще остается его ссылка, а точка останова останавливается несколько раз при остановке точки останова на С++ lib в iOS 8.

Решение

1) Найдите в проекте и удалите (замените) все ссылки на эти шрифты. Может быть в некоторых ножах, подмодулях и т.д.

2) Если вы не можете исправить всюду (например, для использования только для чтения libs), или проблема по-прежнему существует после решения 1, добавьте эти старые шрифты обратно в проект

3) Игнорируйте его - это С++ lib, поэтому измените исключение точки останова с "Все" на "Objective-C" только

Ответ 4

Xcode 9, иногда появляются исключения, но iOS ловит его изящно. Это поможет

введите описание изображения здесь

введите описание изображения здесь

источник

для моего случая, это был пользовательский атрибут в nib