Собирая и выполняя приложение в среде Xcode, вы можете остановить его выполнение с помощью отладчика и использовать его возможности.

Отладчик в среде Xcode 5 называется LLDB.

Между выполнением приложение и его отладкой в среде Xcode существует большая разница; основное различие между ними состоит в том, активны ли точки прерывания или игнорируются. Активность точек прерывания имеет два уровня.

Глобально

Точки прерывания в совокупности могут быть либо активными, либо неактивными. Если точки прерывания неактивные, то выполнение программы не будет приостановлено ни на одной из точек прерывания.

 

Индивидуально

Отдельная точка прерывания может быть включена или отключена. Даже если точки прерывания в совокупности активны, выполнение программы не приостанавливается на точке прерывания, если она отключена. Отключение точки прерывания позволяет оставить точку, в которой впоследствии можно приостановить выполнение программы.

Точка прерывания игнорируется, если она отключена или если все точки прерывания в совокупности не активны.

Важно помнить, что при использовании отладчика приложение должно быть собрано в конфигурации сборки Debug (она используется по умолчанию для схемы действия Run). Отладчик почти бесполезен, если приложение собрано в конфигурации сборки Release, в том числе потому, что оптимизация, выполняемая компилятором, может разрушить связи между инструкциями выполняемого кода и строками исходного кода.

Для создания точки прерывания (рис. 9.4) выберите в редакторе точку, в которой вы хотите сделать паузу, и команду Debug^ Breakpoints1*Add Breakpoint at Current Line (<Command+\>). Комбинация клавиш, указанная в скобках, добавляет точку прерывания в текущую строку и удаляет ее соответственно. Точка прерывания символизируется стрелкой на поле. В качестве альтернативы можно просто щелкнуть на поле, чтобы добавить точку прерывания; для того чтобы удалить точку прерывания жестом, перетащите ее в пределы поля.

 

 Точка прерывания и отключенная точка прерывания

          Рис. 9.4. Точка прерывания         Рис. 9.5. Отключенная точка прерывания

 

Если в вашем коде есть точки прерывания, то вам потребуется механизм для их просмотра и управления. Эту задачу выполняет навигатор точек прерывания. Здесь можно перемещаться по точкам прерывания, включать и отключать их, щелкая на стрелках в навигаторе, а также удалять точки прерывания.

Кроме того, существует возможность изменять поведение точки прерывания. Нажмите клавишу <Control>, щелкните мышью на символе точки прерывания, расположенном на поле или в навигаторе проекта, и выберите команду Edit Breakpoint или нажмите комбинацию команд <Сошшапё+Ор1юп+щелчок на точке прерываниях Это очень мощный инструмент: точку прерывания можно активизировать при определенных условиях или после определенного количества прерываний. Кроме того, с точкой прерывания можно связать одно или несколько действий, например, выполнение команды отладчика, регистрацию ошибок, воспроизведение звука, озвучивание текста или выполнение сценария.

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

программе продолжать свою работу. По определению такие точки прерывания работают только в режиме отладки проекта. Готовое приложение, работающее на реальном устройстве, не должно выводить на экран горы служебной информации.

В навигаторе точек прерывания можно создавать определенные виды точек прерывания, которые невозможно создать в редакторе исходного кода. Щелкните на кнопке Plus в нижней части навигатора и выберите команду из ее всплывающего меню. К наиболее важным относятся следующие типы точек прерывания.

 

Точки прерывания исключения

Точка прерывания исключения приостанавливает выполнение приложения в момент генерирования или перехвата исключения, независимо от того, вызывает ли это исключение сбой впоследствии. Я рекомендую создавать точки прерывания исключения для приостановки приложения в момент генерирования всех исключений, поскольку это дает наилучшее представление о стеке вызовов и значениях переменных в момент появления исключения (это лучше делать сейчас, чем в момент сбоя). Вы видите, в каком месте кода находитесь, и можете проверить значения переменных, что, возможно, позволит понять причины проблемы. Если вы создаете такую точку прерывания исключения, я предлагаю использовать контекстное меню и команду Move Breakpoint То^ User, которая делает точку прерывания постоянной и глобальной для всех ваших проектов.

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

 

Символическая точка прерывания

Символическая точка прерывания приостанавливает выполнение приложения при вызове определенного метода или функции, независимо от того, какой объект осуществляет вызов и какому объекту отправляется сообщение. Такой метод можно указать с помощью символа метода экземпляра или символа метода класса (- или +), за которым следуют квадратные скобки, содержащие имя класса или метода (см. раздел документации A Useful Shorthand). Например, для того чтобы выяснить, откуда было послано сообщение begin ReceivingRemoteControlEvents общему экземпляру в моем приложении, я задаю символическую точку прерывания следующим образом:

-[UIApplication beginReceivingRemoteControlEvents]

В среде Xcode 5 можно указать имя метода, набрав только имя, и оно будет преобразовано в отдельные точки прерывания во всех соответствующих методах класса; затем можно активизировать только ту точку, которую вы хотите. Эта возможность является полезной также для подтверждения, что вы правильно ввели имя метода. Таким образом, я могу создать символическую точку прерывания для метода beginReceivingRemoteControl Events, а среда Xcode сама создаст выражение - [UIApplication beginReceiving RemoteControlEvents].

 

Для изменения состояния всех точек прерывания щелкните на кнопке Breakpoints на панели, расположенной в верхней части панели Debug, или выберите команду Debug ^Activate/ Deactivate Breakpoints (<Command+Y>). Активное состояние всех точек прерывания в совокупности не влияет на включение или выключение отдельных точек прерывания; если точки прерывания были неактивными, они просто все игнорируются, и никаких прерываний

не возникает. Стрелки, символизирующие точки прерывания, окрашены голубым цветом, если точки прерывания являются активными, и серым, если нет.

Когда приложение выполняется с активными точками прерывания и обнаруживает включенную точку прерывания (или выполняются условия ее включения и т.д.), оно приостанавливает выполнение. В активном окне проекта редактор показывает файл, содержащий точку выполнения, которым обычно является файл, содержащий точку прерывания. Точка выполнения изображается серой стрелкой; это строка, которая должна быть выполнена (рис. 9.6). В зависимости от настроек команды Running^Pauses в окне настроек Behaviors на экране может открыться окно навигатора отладки и панель Debug.

 

 Пауза в точке прерывания

Рис. 9.6. Пауза в точке прерывания

 

Перечислим некоторые действия, которые можно выполнить во время паузы в точке прерывания.

 

Выяснить, где вы находитесь

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

Методы, перечисленные в стеке вызовов вместе с пиктограммой User и выделенные черным шрифтом, — это ваши методы; щелкните на одном из них, чтобы увидеть, в каком месте этого метода возникла пауза. Другие методы, текст которых окрашен в серый цвет, — это методы, для которых вы не написали код, поэтому щелкать на них нецелесообразно, если вы не знаете ассемблера. Ползунок на панели фильтра скрывает часть цепочки вызовов, чтобы сэкономить место, начиная с методов, для которых у вас нет кода.

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

 

Изучение значений переменных

Это очень распространенная причина для приостановки. На панели Debug выводится список значений переменных в текущей области видимости (в соответствии с выделением в стеке вызовов). Щелкнув на треугольнике открытия, вы увидите дополнительные свойства объекта, например элементов коллекции, переменных экземпляра и даже часть закрытой информации. Здесь можно увидеть значения локальных переменных, даже если до приостановки выполнения они не были инициализированы; эти значения не имеют смысла и должны игнорироваться.

Переключите всплывающее меню под списком переменных в состояние Auto, чтобы просматривать только те переменные, которые по мнению среды Xcode должны вас интересовать (например, потому что их значения недавно изменились). Если вас интересует полная информация, лучше всего установить настройку Local. Для фильтрации имен и значений можно использовать поле поиска. Если форматированный краткий отчет недостаточно информативный, вы можете послать переменной объекта описание (или, если вы

реализовали его, описание debugDescription) и просмотреть вывод на консоль. Для этого выберите команду Print Description of [Variable] в контекстном меню или выберите переменную и щелкните на кнопке Info под списком переменных.

В среде Xcode 5 появился новый мощный инструмент для просмотра значения переменной в графическом представлении: выделите переменную и щелкните на кнопке Quick Look (пиктограмма в виде глаза) под списком переменных или нажмите клавишу <Spacebar>. Например, графическое представление структуры данных CGRect является масштабируемым прямоугольником.

Кроме того, в среде Xcode 5 всплывающие подсказки (data tips) сделаны более информативными. Для того чтобы увидеть всплывающую подсказку, наведите курсор мыши на имя переменной в вашем коде. Всплывающая подсказка напоминает маленький экран для вывода данного значения в списке переменных: в нем есть изогнутый треугольник, щелкнув на котором можно получить более полную информацию, кнопка Info, щелкнув на которой можно увидеть описание значения в этом окне и на консоли, а также кнопка Quick Look для графического представления значения (рис. 9.7).

 

 Подсказка

Рис 9.7 Подсказка

 

Кроме того, существует возможность изменить значения переменных во время паузы для отладки. Выберите строку в списке переменных и нажмите клавишу <Return>, чтобы сделать ее редактируемой, или дважды щелкните на подсказке; так можно изменить простые скалярные значения (например, числа типов float и int, а также указатели). Можно также использовать команду ехрг на консоли, чтобы задать значение. Эту возможность следует использовать осторожно (или не использовать вообще).

 

Установка точки наблюдения

Точка наблюдения похожа на точку прерывания, но вместо привязки к определенной строке программы она зависит от значения переменной: как только значение этой переменой изменяется, отладчик приостанавливает выполнение приложения. Точку наблюдения можно установить только во время паузы в работе отладчика. Нажмите клавишу <Control>, щелкните на переменной в списке переменных и выберите команду Watch [Variable]. Созданные точки наблюдения перечисляются и управляются в окне навигатора точек прерывания. Поскольку для работы с точками наблюдения требуются дополнительные ресурсы, их количество не должно быть большим.

 

Управление выражениями

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

 

Общение с отладчиком

Используя консоль, можно общаться непосредственно с отладчиком. Интерфейс отладчика среды Xcode — это средство общения с программой LLDB; для того чтобы общаться непосредственно с отладчиком LLDB, можно делать все, что вы обычно делаете с интерфейсом отладчика в среде Xcode, и даже больше.

Распространенной командой является ро (сокращение от “print object”— “вывести объект”), за которой следует имя переменной объекта или вызов метода, возвращающего объект. Эта команда вызывает метод описания объекта (или, если вы реализовали его, описание debugDescription). Другая важная команда — ехрг, которая вычисляет выражение на языке Objective-C в текущем контексте, т.е. помимо прочего, вы можете вызвать метод или изменить значение переменной в области видимости! Любая консольная команда отладчика LLDB может также выполняться как действие Debugger Command, связанное с точкой прерывания.

 

Манипулирование точками прерывания

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

Действительно, это одно из главных преимуществ точек прерывания над грубой отладкой. Для того чтобы изменить грубую отладку, необходимо остановить выполнение приложения, отредактировать его, собрать заново и запустить снова. Однако для манипуляций с точками прерывания программу останавливать не обязательно! Операцию, которая выполняется неправильно, но не вызывает краха программы, можно повторить в реальном времени; вы можете просто добавить точку прерывания и попытаться снова. Например, если кнопка при нажатии работает неправильно, вы можете добавить точку прерывания и снова ее нажать; в этот раз будет выполнен тот же самый код, и вы сможете понять, в чем заключается проблема.

 

Пошаговая отладка или продолжение

Для того чтобы продолжить выполнение приостановленного приложения, вы можете либо возобновить выполнение, пока не встретится следующая точка прерывания (Debug^Continue), либо сделать один шаг и снова остановиться. Кроме того, вы можете выделить строку и выбрать команду Debug ^Continue to Current Line (или Continue to Here из контекстного меню), которая устанавливает точку прерывания на указанной строке, продолжает выполнение и удаляет эту точку прерывания.

Перечислим команды пошаговой отладки в меню Debug.

 

Step Over

Пауза на следующей строке.

 

Step Into

Пауза в методе, который вызывается в текущей строке, если он есть; в противном случае пауза на следующей строке.

 

Step Out

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

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

 

 

Если команда Step Over не достигает следующей строки из-за точки прерывания в методе, вызванном в текущей строке, команда Continue автоматически остановит выполнение программы, — вы не обязаны выполнять команду Step Out из-за неожиданной точки прерывания.

 

Start over или abort

Для того чтобы прекратить выполнение приложения, щелкните на кнопке Stop инструментальной панели (Product^Stop, <Command+Period>). Щелчок на кнопке Ноте в окне Simulator (Hardware^Ноте) или на устройстве не прекращает выполнение приложения в многозадачной системе iOS 4 и в более поздних версиях. Для того чтобы остановить выполняемое приложение и запустить его заново без повторной сборки, нажмите клавишу <Control> и щелкните на кнопке Run инструментальной панели (Product^Perform Action^Run Without Building, <Command+Control+R>).

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


 

 

 

Добавить комментарий