Android Studio Debugging: Базовые понятия и возможности
Часть первая, основы
Что такое отладка?
Я уверен что 95% читателей этой публикации прекрасно знают что такое отладка приложения, и, говоря по простонародному, уже не раз дебажили свои приложения в поисках ошибки или проверки работы своей программы.
И все же краткое вступление с теорией будет. Поэтому если вы знаете что такое отладка, то пропустите этот раздел и листайте вниз, или сразу перейдите к второй части.
Отладка или debugging приложения — это процесс поиска и исправление ошибок или неправильного поведения кода.
Например: при получении ответа с сервера и его обработке внутри вашего приложения происходит непонятная ошибка и на экране выводится устаревшая информация вместо новой. Чтоб разобраться что происходит и найти ошибку мы можем при помощи отладки поставить выполнение программы на паузу в нужном нам месте и посмотреть содержимое наших объектов и переменных.
Именно для этого и нужна отладка: приостанавливать выполнение кода в нужном месте и изучении состояния приложения.
Основы отладки
В этой статье я расскажу базовые вещи и возможности отладчика в Android Studio. В следующей статье я постараюсь рассказать о некоторых тонкостях и продвинутых возможностях работы с отладкой.
Как запустить отладку — Android Debugger
Запустить отладчик в Android Studio можно двумя способами:
Первый способ: Запустить приложение в режиме отладки. Стоит использовать если нужно отладить именно запуск приложения. Для отладки конкретного действия-экрана лучше использовать второй способ, так быстрее.
Второй способ: Подключить Android Debugger к уже запущенному процессу. Удобно, потому что бывает нужно продебажить конкретный экран или нажатие на кнопку, а запускать каждый раз приложение в режиме отладки долго и неудобно.
Как остановить отладку
Остановить отладку можно здесь:
Или здесь:
Breakpoins или точки остановки
Breakpoint или точка остановки — специальный флаг для Android Debugger-a который означает “Останови выполнение программы в этом месте”.
На скриншоте выше видно две точки остановки. Интересно, что они сообщают некую информацию о себе: одна из них с галочкой а другая с крестиком.
Галочка значит что эта точки остановки активная и кода выполнение кода подойдет к этой строке выполнение программы будет остановлено.
Крестик обозначает что выполнение кода на этой строке невозможно (например у пустой строки или, как в примере выше, у ключевого слова)
Как сделать точку остановки — breakpoint
Для добавления точки остановки нужно кликнуть на серой области напротив строки с кодом или нажать ⌘+F8.
Выбор точки остановки — set breakpoint
Практически все современные Android приложения используют Kotlin и RxJava. И при типичном использовании этой связки языка и библиотеки при добавлении точки остановки иногда появляется такой выбор:
Android Studio предлагает нам выбрать где именно мы хотим добавить точку остановки — момент выполнения метода subscribe в Rx-цепочке или выполнение кода внутри лямбды, которую мы передаем в subscribe. А можно поставить точку остановки сразу для двух действий (All).
Примечание для новичков: Если вы хотите отладить действие, которое вы планируете выполнить внутри метода subscribe, и не поняли в примере выше где именно вам поставить точку остановки — вам нужно поставить ее внутри лямбда выражения.
Просмотр информации во время отладки приложения
Подсказки от Android Studio
Подсказки от Android Studio во время отладки — приятный бонус. В них отображается полезная информация, например значение локальных переменных, аргументов и объектов (для них выводится информация из метода toString() соответствующего объекта).
Стек вызова методов — Frames
В вкладке Debugger во время остановки выполнения приложения выводится стек вызова методов.
Благодаря этому можно понять — откуда мы попали в текущий метод.
Желтым цветом подсвечиваются классы Android SDK или библиотек — там, где у нас нет доступа к исходному коду.
Формат вывода информации о методе такой:
- Название метода — methodThree
- Номер строки с точкой остановки— 22
- Название класса — DebugStateDemoObject
- package класса
Просмотр информации состояния объекта и переменных — Variables
Помимо панели со стеком вызова методов в вкладе Debug также находится и панель с выводом текущего состояния и значениями локальных переменных.
На первой строке выводится информация об объекте, чей метод был вызван и остановлен для отладки. Интересно, что по двойному клику на это строчку можно будет увидеть дополнительную информацию о состоянии текущего класса.
На второй строке выводится информация о локальной переменой, в данном случае это еще и аргумент переданный в этот метод.
Изменение значения переменой “на лету”
Значение локальной переменной можно изменить нажав правой клавишей мышки -> Set value… или по нажатию на F2.
Стек методов + состояние объекта
Стоит запомнить, что состояние объекта при переходе по стеку методов не меняется. То есть, при просмотре методов из стека в разделе с информацией о состоянии объекта и локальных переменных, он же Variables, будет показано самое последнее состояние объекта не зависимо от просматриваемого метода.
Для иллюстрации этого давайте проведем эксперимент. Итак у нас есть следующий код:
Давайте добавим точку остановки на 19 строку внутри метода methodThree() и запустим этот код в режиме отладки.
Но перед этим поясню что мы хотим уточнить: если значения объектов сохраняются в стек, то при переходе в стеке вызова методов внутри вкладки Debug значение поля counter будет меняться. Если состояние объекта не сохраняется, то counter всегда будет с его актуальным (последним) значением.
Управление процессом отладки
Во время отладки Android Debugger в Android Studio позволяет нам управлять процессом отладки.
Без знания этих инструментов процесс отладки будет сложным и запутанным, так что давайте познакомимся с этими возможностями поближе.
Продолжить выполнение программы
Когда во время отладки выполнение кода программы подходит к строке на которой установлен Breakpoint (точка остановки), выполнение программы приостанавливается. По нажатию на эту кнопку выполнение программы будет выполнятся дальше.
Приостановить выполнение программы
Есть возможность и просто приостановить приложение во время отладки поставив его на паузу. Сам этот режим, его цель и как он работает я, если честно, не очень понял. Я сделал эксперимент с бесконечным циклом, внутри которого инкрементяться 3 переменных типа Long, и в случайный момент делал паузу: выполнение кода останавливалось на строке с объявлением while(true), я даже видел значения переменных, но на этом все.
Остановка отладки
Саму отладку можно остановить по нажатию на кнопку стоп. В последнее время останавливается не только отладка но и приложение; грустно.
Просмотр и настройка breakpoints (точек остановок) в проекте
Эта возможность архи полезная: во первых здесь можно просмотреть все breakpoints в проекте. Во-вторых здесь можно отключить/включить выборочно нужные нам breakpoints. Мы еще вернемся к возможностям этой функции позже, в следующей статье.
Приглушить все breakpoints
А еще можно приглушить (Mute) все наши точки остановки по нажатию на эту кнопку. Интересно что во время отладки по нажатию на эту кнопку точки остановки действительно не отрабатывают, но у меня после отключения этой возможности точки оставались “приглушенными” и дальше. Может быть баг Android Studio а может и эмулятора — я этого не понял и выглядит это странно. Если кто-то мне подскажет что происходит я буду очень рад!
Получение dump-а потоков приложения
Есть возможность получить dump с состоянием всех потоков в процессе и даже вывод стектрейса с местом выполнения кода. Выглядит это так:
Этот режим будет полезен при отладке сложных, многопоточных приложений.
Настройка отображения данных и UI вкладки Debug
Первая иконка может восстановить разметку вкладки Debug в первоначальное состояние (если чото сдвинули мышкой неудачно)
Вторая кнопка откроет меню в котором можно настроить отображение информации.
Третья кнопка предлагает закрепить текущую вкладку в разделе Debug а четвертая кнопка, та что крестик, закроет вкладку соотвественно.
Навигация по коду
В момент срабатывания точки остановки выполнение кода приостанавливается и мы можем узнать состояние наших объектов и переменных. Но иногда одной точки остановки может быть недостаточно, и для основательного исследования работы нашего кода нам понадобится шаг за шагом выполнять какое-то действие и смотреть что к чему.
Для этого мы можем воспользоваться возможностью двигаться по коду, выполняя нужный нам фрагмент за фрагментом.
Давайте разберемся с этим!
Перейти к текущей точке остановки
По нажатию на эту кнопку курсор и фокус будет перемещены на текущую точку остановки. Удобно если потерялся.
Переход к следующей строке
Переход к следующей строке кода внутри текущего метода, не заходя в вызываемый метод (если он вызывается).
Переход дальше + принудительно
Переход в вызываемый метод к его первой строке.
Красная стрелка — тоже самое, но делает это принудительное, если по какой то причине просто перейти нельзя.
Выход из текущего метода
Выход из текущего метода на следующую строку кода
Выполнить до курсора
А еще можно выполнить код до той строки, на которой находится курсор. Курсор перед этим можно перемещать до куда нам нужно. Очен здоровская возможность!
Debug like a pro
В этой статье мы разобрали основы отладки в Android разработке. В следующей статье я планирую рассказать о продвинутых возможностях отладки что поможет вам дебажить код как настоящий профи!
Дополнительная информация:
- Этот раздел будет дополнятся по мере написания новых публикаций. Подписывайтесь чтоб не пропустить!