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 (опять же, устройства или симулятора), исключение не выбрасывается.
Можно ли понять, что может вызвать это странное поведение?
Ответы
Ответ 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