#swift #xcode #breakpoints
#быстрый #xcode #точки останова
Вопрос:
Мои контрольные точки, похоже, увеличиваются. Я обнаружил, что некоторые точки останова срабатывали, а другие — нет. Вот один пример:
Я попытался создать новый проект приложения iOS (интерфейс: раскадровка, жизненный цикл: делегат приложения UIKit). Единственное изменение кода, которое я внес, это:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
print("traitCollectionDidChange -- called --")
}
Затем у меня есть точка останова в строке печати. Проект создается и запускается, и если я изменяю переопределения среды для изменения размера текста / динамического типа, приведенная выше инструкция печати регистрируется, но точка останова не срабатывает.
Я проверил несколько различных настроек, как предложено здесь, и из других источников, но я не могу понять, как это исправить. Я проверил схемы, настройки, удалил файл DerivedData, даже переустановил xCode… Также попробовал переустановить инструменты разработчика командной строки.
Я потратил несколько часов, пытаясь разобраться в этом. Любая помощь была бы очень признательна.
Обновить:
Тем временем я зарегистрировал дефект в Apple. Кажется, что при использовании инспектора доступности для изменения размера шрифта traitCollectionDidChange
вызывается then (как и при переопределении среды), но разница в том, что при использовании инспектора доступности срабатывает точка останова. Если вы вернетесь к переопределениям среды, то он «прерывает» инспектор доступности, а затем traitCollectionDidChange
больше не вызывается, и соответствующая точка останова также не срабатывает. Перестройка сбрасывает эту проблему.
Комментарии:
1. Достигаются ли другие точки останова? Если нет — работаете ли вы в режиме отладки или выпуска?
2. ДА. Другие точки останова будут поражены. Я только что заметил, что некоторые из них таковыми не являются. Выполняется в режиме отладки. Другие точки останова работают, но некоторые из них не такие, как указано выше. Я не смог разглядеть никакой разницы между теми, которые есть, и теми, которых нет.
3. Возможно, это поможет экспортировать точки останова в JSON и проверить, нет ли внутри чего-то странного. Для экспорта используйте
breakpoint write -f ~/breakpoints.json
в консоли отладки.4. Затем попробуйте перебор. Я опубликую ответ, потому что поле для комментариев слишком маленькое.
Ответ №1:
Попробуйте атаковать грубой силой:
- Создание глобальной функции
func forceBreakpoint() {
print ("breakepoint hit")
}
- вызовите эту функцию
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
print("traitCollectionDidChange -- called --")
forceBreakpoint()
}
- создайте символическую точку останова для
forceBreakpoint
Запустите приложение и надейтесь, что точка останова наступит прямо сейчас.
Комментарии:
1. Спасибо. Я действительно пробовал это. Точка останова не срабатывает, хотя оператор печати вызывается. Тем не менее, вращение устройства симулятора запускает точку останова (и оператор печати).
2. и каков результат
br list
для этой точки останова? Вы должны получить что-то вродеlanguage = swift, locations = 1, resolved = 1, hit count =
, а затем a0
, если оно не было поражено, или a1
, если оно было поражено.3. Так что это интересно… Количество попаданий показывает правильное количество,
br list
даже если Xcode никогда не «останавливался» в этой точке останова….