Android Studio предоставляет отладчик, который позволяет делать следующее и многое другое:
- Выберите устройство для отладки вашего приложения.
- Установите точки останова в коде Java, Kotlin и C/C++.
- Изучите переменные и оцените выражения во время выполнения.
Эта страница содержит инструкции по основным операциям отладчика. Дополнительную документацию также можно найти в документации по отладке IntelliJ IDEA .
Включить отладку
Прежде чем приступить к отладке, выполните следующие действия:
- Включите отладку на вашем устройстве.
- Если вы используете эмулятор, отладка включена по умолчанию. Но для подключенного устройства нужно включить отладку в настройках разработчика устройства .
- Запустите отлаживаемый вариант сборки.
Используйте вариант сборки , который включает в себя
debuggable true
(isDebuggable = true
в сценариях Kotlin) в конфигурации сборки.Обычно вы можете выбрать вариант «отладки» по умолчанию, который включен в каждый проект Android Studio, даже если он не отображается в файле
build.gradle
. Однако если вы определяете новые типы сборки, которые должны быть отлаживаемыми, вы должны добавитьdebuggable true
к типу сборки:- Установите точки останова в коде вашего приложения.
- На панели инструментов выберите устройство для отладки вашего приложения в меню целевого устройства.
Если у вас не настроено ни одно устройство, то вам необходимо либо подключить устройство через USB , либо подключить устройство через Wi-Fi , либо создать AVD для использования эмулятора Android .
- На панели инструментов нажмите «Отладка». .
Если ваше приложение уже запущено на устройстве, отображается диалоговое окно с вопросом, хотите ли вы переключиться с режима «Выполнить» на режим «Отладка». Чтобы начать отладку, устройство необходимо перезагрузить. Чтобы сохранить работу того же экземпляра приложения, нажмите «Отменить отладку» и вместо этого присоедините отладчик к работающему приложению . В противном случае Android Studio создает APK, подписывает его ключом отладки, устанавливает на выбранное вами устройство и запускает.
Если вы добавите в проект код C и C++ , Android Studio также запустит отладчик LLDB в окне «Отладка» для отладки вашего собственного кода.
- Если окно «Отладка» не открыто, выберите «Просмотр» > «Окна инструментов» > «Отладка » или нажмите «Отладка». в панели окна инструментов.
- Нажмите «Прикрепить отладчик к процессу Android». .
- В диалоговом окне «Выбор процесса» выберите процесс, к которому вы хотите подключить отладчик.
- Если вы используете эмулятор или рутованное устройство, вы можете установить флажок «Показать все процессы», чтобы увидеть все процессы. На корневом устройстве будут показаны все процессы, запущенные на устройстве. Однако на нерутированном устройстве будут показаны только отлаживаемые процессы.
- В меню «Использовать настройки отладчика Android» вы можете выбрать существующую конфигурацию запуска/отладки . Для кода C и C++ это позволяет повторно использовать команды запуска LLDB, команды последующего подключения LLDB и каталоги символов в существующей конфигурации.
- Если у вас нет существующей конфигурации запуска/отладки, выберите «Создать новую» . Этот выбор включает меню «Тип отладки» , в котором можно выбрать другой тип отладки . По умолчанию Android Studio использует тип отладки «Определить автоматически», чтобы выбрать для вас лучший вариант отладчика в зависимости от того, содержит ли ваш проект код Java или C/C++.
- Нажмите ОК .
Появится окно отладки.
- Панель инструментов «Выполнение и навигация» См. «Работа с точками останова».
- Выбор нити
- Оценка и просмотр записи выражения. См. Проверка переменных .
- Отображение стека
- Панель переменных. См. Проверка переменных .
- Обнаруживать автоматически
- Выберите этот тип отладки, если хотите, чтобы Android Studio автоматически выбирала лучший вариант для отлаживаемого кода. Например, если в вашем проекте есть код C или C++, Android Studio автоматически использует тип отладки Dual. В противном случае Android Studio использует тип отладки «Только Java».
- Только Java
- Выберите этот тип отладки, если вы хотите отлаживать только код, написанный на Java или Kotlin. Отладчик только для Java игнорирует любые точки останова или наблюдает за ними, установленными в вашем собственном коде.
- Только встроенный код (доступно только с кодом C/C++)
- Выберите этот тип отладки, если вы хотите использовать для отладки кода только LLDB. При использовании этого типа отладки представление сеанса отладчика Java недоступно. По умолчанию LLDB проверяет только ваш собственный код и игнорирует точки останова в вашем Java-коде. Если вы хотите также отлаживать код Java, переключитесь на тип отладки «Автоматическое обнаружение» или «Двойной».
Собственная отладка работает только на устройствах, отвечающих следующим требованиям:
Устройство поддерживает
run-as
.Чтобы проверить, поддерживает ли устройство
run-as
, выполните следующую команду в оболочке ADB, подключенной к вашему устройству:run-as your-package-name pwd
Замените
your-package-name
на имя пакета вашего приложения. Если устройство поддерживаетrun-as
, команда должна вернуться без ошибок.На устройстве включен
ptrace
.Чтобы проверить, включен ли
ptrace
, выполните следующую команду в оболочке ADB, подключенной к вашему устройству:sysctl kernel.yama.ptrace_scope
Если
ptrace
включен, команда выведет значение0
илиunknown key
. Еслиptrace
не включен, он выведет значение, отличное от0
.
- Двойной (Java + Native) — доступен только с кодом C/C++.
- Выберите этот тип отладки, если вы хотите переключаться между отладкой Java и машинного кода. Android Studio подключает к процессу вашего приложения как отладчик Java, так и LLDB, поэтому вы можете проверять точки останова как в Java, так и в собственном коде, не перезапуская приложение и не изменяя конфигурацию отладки.
На рисунке 2 обратите внимание на две вкладки справа от заголовка окна отладки. Поскольку приложение содержит код как Java, так и C++, одна вкладка предназначена для отладки собственного кода, а другая — для отладки кода Java, на что указывает параметр -java .
- Точка останова строки
- Наиболее распространенным типом является точка останова на строке, которая приостанавливает выполнение вашего приложения на указанной строке кода. Во время паузы вы можете проверять переменные, оценивать выражения, а затем продолжать выполнение построчно, чтобы определить причины ошибок во время выполнения.
- Точка останова метода
- Точка останова метода приостанавливает выполнение вашего приложения, когда оно входит в определенный метод или выходит из него. Во время паузы вы можете проверять переменные, оценивать выражения, а затем продолжать выполнение построчно, чтобы определить причины ошибок во время выполнения. Когда вы устанавливаете точку останова для составной функции, отладчик перечисляет параметры составной функции и их состояние, чтобы помочь определить, какие изменения могли вызвать рекомпозицию.
- Точка останова на поле
- Точка останова на поле приостанавливает выполнение вашего приложения, когда оно читает или записывает в определенное поле.
- Точка останова исключения
- Точка останова исключения приостанавливает выполнение вашего приложения при возникновении исключения.
- Найдите строку кода, выполнение которой вы хотите приостановить.
- Щелкните левую полосу вдоль этой строки кода или поместите курсор на линию и нажмите Control+F8 (в macOS — Command+F8 ).
- Если ваше приложение уже запущено, нажмите «Прикрепить отладчик к процессу Android». . В противном случае, чтобы начать отладку, нажмите «Отладка». .
Чтобы просмотреть дерево объектов на наличие переменной, разверните его в представлении «Переменные». Если представление «Переменные» не отображается, нажмите «Настройки макета». и убедитесь, что переменные проверены.
Чтобы перейти к следующей строке кода без ввода метода, нажмите «Перешагнуть». .
Чтобы перейти к первой строке внутри вызова метода, нажмите «Шаг с заходом». .
Чтобы перейти к следующей строке за пределами текущего метода, нажмите «Выйти». .
Чтобы продолжить работу приложения в обычном режиме, нажмите «Возобновить программу». .
- Android Studio переключается на вкладку <your-module> , когда отладчик LLDB обнаруживает точку останова в вашем коде C/C++. Панели «Кадры», «Переменные» и «Контрольные значения» также доступны и работают точно так же, как если бы вы отлаживали код Java.
Хотя панель «Потоки» недоступна в представлении сеанса LLDB, вы можете получить доступ к процессам вашего приложения, используя список на панели «Кадры». Узнайте больше об этих панелях в разделах, посвященных отладке оконных рамок и проверке переменных .
Примечание. При проверке точки останова в собственном коде система Android приостанавливает работу виртуальной машины, на которой выполняется байт-код Java вашего приложения. Это означает, что вы не можете взаимодействовать с отладчиком Java или получать какую-либо информацию о состоянии из сеанса отладчика Java при проверке точки останова в собственном коде.
- Android Studio переключается на вкладку <your-module> -java, когда отладчик Java обнаруживает точку останова в вашем коде Java или Kotlin.
- При отладке с помощью LLDB вы можете использовать терминал LLDB в представлении сеанса LLDB для передачи параметров командной строки в LLDB . Если у вас есть определенные команды, которые вы хотите, чтобы LLDB выполняла каждый раз, когда вы начинаете отладку приложения, либо непосредственно перед, либо сразу после подключения отладчика к процессу вашего приложения, вы можете добавить эти команды в свою конфигурацию отладки .
- Введите выражение для просмотра или отображения
- Нажмите «Добавить к наблюдениям» или нажмите Enter, чтобы вычислить выражение один раз.
- Ваше целевое физическое устройство или эмулятор использует процессор x86 или x86_64. Если ваше устройство использует процессор ARM, вам необходимо выровнять границу адреса вашей переменной в памяти либо до 4 байтов для 32-битных процессоров, либо до 8 байтов для 64-битных процессоров. Чтобы выровнять переменную в вашем собственном коде, укажите
__attribute__((aligned( num_bytes )))
в замедлении переменной, как показано ниже:// For a 64-bit ARM processor int my_counter __attribute__((aligned(8)));
- Вы уже назначили три или меньше точек наблюдения. Android Studio поддерживает только до четырех точек наблюдения на целевых устройствах x86 или x86_64. Другие устройства могут поддерживать меньше точек наблюдения.
- Пока ваше приложение приостановлено на точке останова, перейдите к панели «Переменные» в представлении сеанса LLDB.
Щелкните правой кнопкой мыши переменную, занимающую блок памяти, который вы хотите отслеживать, и выберите «Добавить точку наблюдения» .
Появится диалоговое окно для настройки точки наблюдения, как показано на рисунке 9.
Настройте точку наблюдения со следующими параметрами:
- Включено: отмените выбор этого параметра, если вы хотите, чтобы Android Studio игнорировала точку наблюдения, пока вы не измените настройку. Android Studio сохраняет вашу точку наблюдения, чтобы вы могли получить к ней доступ позже.
- Приостановить: по умолчанию система Android приостанавливает процесс вашего приложения, когда оно обращается к блоку памяти, который вы назначаете точке наблюдения. Снимите флажок с этой опции, если вы не хотите такого поведения. Это открывает дополнительные параметры, которые вы можете использовать для настройки поведения, когда система взаимодействует с вашей точкой наблюдения: записать сообщение на консоль и удалить при нажатии .
- Тип доступа: выберите, должно ли ваше приложение активировать точку наблюдения при попытке чтения или записи в блок памяти, который система выделяет для переменной. Чтобы активировать точку наблюдения при чтении или записи, выберите «Любой» .
- Нажмите Готово .
- В списке «Переменные» щелкните правой кнопкой мыши в любом месте строки ресурса, чтобы отобразить список.
- В списке выберите «Просмотреть как» и выберите формат, который хотите использовать.
Доступные форматы зависят от типа данных выбранного вами ресурса. Вы можете увидеть один или несколько из следующих вариантов:
- Класс: отображение определения класса.
- toString: формат отображаемой строки.
- Объект: отображение определения объекта (экземпляра класса).
- Массив: отображение в формате массива.
- Временная метка: отображает дату и время следующим образом: гггг-мм-дд чч:мм:сс.
- Авто: Android Studio выбирает лучший формат в зависимости от типа данных.
- Двоичный: отображение двоичного значения с использованием нулей и единиц.
- MeasureSpec: значение, передаваемое от родительского элемента к выбранному дочернему элементу. См.
MeasureSpec
. - Hex: Отображается в виде шестнадцатеричного значения.
- Примитивный: отображается в виде числового значения с использованием примитивного типа данных.
- Целое число: отображается как числовое значение типа
Integer
.
- Щелкните правой кнопкой мыши значение ресурса.
- Выберите «Просмотреть как ».
- Выберите Создать .
- Откроется диалоговое окно Средства визуализации типов данных Java . Следуйте инструкциям в разделе Средства визуализации типов данных Java .
классный
android { buildTypes { customDebugType { debuggable true ... } } }
Котлин
android { buildTypes { create("customDebugType") { isDebuggable = true ... } } }
Это свойство также применимо к модулям с кодом C/C++ .
Примечание. Свойство jniDebuggable
больше не используется.
Если ваше приложение зависит от библиотечного модуля, который вы также хотите отладить, эта библиотека также должна быть упакована с debuggable true
чтобы она сохраняла свои символы отладки. Чтобы гарантировать, что отлаживаемые варианты вашего проекта приложения получат отлаживаемый вариант библиотечного модуля, опубликуйте версии вашей библиотеки, отличные от стандартных.
Начать отладку
Вы можете начать сеанс отладки следующим образом:
Подключите отладчик к работающему приложению
Если ваше приложение уже запущено на вашем устройстве, вы можете начать отладку без перезапуска приложения следующим образом:
На вкладке «Процессы» в обозревателе устройств ( «Просмотр» > «Инструменты Windows» > «Обозреватель устройств» ) также имеется список процессов, подлежащих отладке. Оттуда вы можете выбрать процесс и выполнить убийство. , принудительная остановка или присоедините отладчик к данному процессу .
Окно отладки
Окно отладки разделено на
Примечание. Отладчик Android Studio и сборщик мусора слабо интегрированы. Виртуальная машина Android гарантирует, что любой объект, о котором знает отладчик, не будет собран мусором до тех пор, пока отладчик не отключится. Это может привести к скоплению объектов при подключенном отладчике. Например, если отладчик видит работающий поток, связанный объект Thread
не будет собирать мусор до тех пор, пока отладчик не отключится, даже если поток завершился.
Изменить тип отладчика
Поскольку для отладки кода Java/Kotlin и кода C/C++ требуются разные инструменты отладчика, отладчик Android Studio позволяет вам выбрать, какой тип отладчика использовать. По умолчанию Android Studio решает, какой отладчик использовать, в зависимости от того, какие языки она обнаруживает в вашем проекте, используя тип отладчика «Определять автоматически» .
Чтобы вручную выбрать отладчик в конфигурации отладки , нажмите «Выполнить» > «Изменить конфигурации» . Вы также можете выбрать отладчик в диалоговом окне, которое появляется при нажатии кнопки «Выполнить» > «Присоединить отладчик к процессу Android» .
Доступные типы отладки включают следующее:
Примечание. При отладке машинного кода, оптимизированного компилятором, вы можете получить следующее предупреждающее сообщение:
This function was compiled with optimizations enabled. Some debugger features may not be available
. При использовании флагов оптимизации компилятор вносит изменения в скомпилированный код, чтобы сделать его более эффективным. Это может привести к тому, что отладчик сообщит неожиданную или неверную информацию, поскольку отладчику будет сложно сопоставить оптимизированный скомпилированный код обратно с исходным исходным кодом. По этой причине вам следует отключить оптимизацию компилятора во время отладки собственного кода.
Используйте системный журнал
В системном журнале отображаются системные сообщения во время отладки приложения. Эти сообщения включают информацию из приложений, работающих на устройстве. Если вы хотите использовать системный журнал для отладки приложения, убедитесь, что ваш код записывает сообщения журнала и печатает трассировку стека для исключений, пока ваше приложение находится на этапе разработки.
Напишите сообщения журнала в своем коде
Чтобы записывать сообщения журнала в свой код, используйте класс Log
. Сообщения журнала помогают понять поток выполнения, собирая выходные данные отладки системы во время взаимодействия с приложением. Сообщения журнала также могут сообщить вам, в какой части вашего приложения произошел сбой. Дополнительные сведения о ведении журналов см. в разделе Запись и просмотр журналов с помощью Logcat .
В следующем примере показано, как можно добавить сообщения журнала, чтобы определить, доступна ли предыдущая информация о состоянии при запуске вашей активности:
Котлин
import android.util.Log ... class MyActivity : Activity() { ... override fun onCreate(savedInstanceState: Bundle?) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state") /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available") /* initialize app */ } ... } ... companion object { private val TAG: String = MyActivity::class.java.simpleName ... } }
Ява
import android.util.Log; ... public class MyActivity extends Activity { private static final String TAG = MyActivity.class.getSimpleName(); ... @Override public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state"); /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available"); /* initialize app */ } ... } }
Во время разработки ваш код также может перехватывать исключения и записывать трассировку стека в системный журнал:
Котлин
fun someOtherMethod() { try { ... } catch (e : SomeException) { Log.d(TAG, "someOtherMethod()", e) } }
Ява
void someOtherMethod() { try { ... } catch (SomeException e) { Log.d(TAG, "someOtherMethod()", e); } }
Примечание. Удалите сообщения журнала отладки и вызовы печати трассировки стека из своего кода, когда вы будете готовы опубликовать свое приложение. Для этого установите флаг DEBUG
и поместите сообщения журнала отладки внутри условных операторов.
Просмотр системного журнала
Вы можете просматривать и фильтровать отладочные и другие системные сообщения в окне Logcat, как показано на рис. 4. Например, вы можете видеть сообщения, когда происходит сбор мусора, или сообщения, которые вы добавляете в свое приложение с помощью класса Log
.
Чтобы использовать Logcat, запустите отладку и выберите вкладку Logcat.
Описание Logcat и его параметров фильтрации см. в разделе Запись и просмотр журналов с помощью Logcat .
Работа с точками останова
Android Studio поддерживает точки останова, которые запускают различные действия по отладке. Существует несколько типов точек останова:
Вы можете установить условные точки останова, которые приостанавливают выполнение только при выполнении определенных условий. Вы также можете установить точки останова журналирования, которые записывают данные в Logcat без приостановки выполнения. Это поможет избежать засорения кода операторами журнала.
Чтобы добавить точку останова на строке, выполните следующие действия:
Когда вы устанавливаете точку останова, рядом со строкой появляется красная точка, как показано на рисунке 5.
Когда выполнение вашего кода достигает точки останова, Android Studio приостанавливает выполнение вашего приложения.
Чтобы определить состояние приложения, используйте инструменты на вкладке «Отладчик»:
Если в вашем проекте используется какой-либо собственный код, по умолчанию тип отладки «Определить автоматически» присоединяет к вашему приложению отладчик Java и LLDB как два отдельных процесса. Вы можете переключаться между проверкой точек останова Java и C/C++, не перезапуская приложение и не изменяя настройки.
Примечание. Чтобы Android Studio могла обнаруживать точки останова в коде C или C++, вам необходимо использовать тип отладки, поддерживающий LLDB, например «Автоматическое обнаружение», «Собственный» или «Двойной». Вы можете изменить тип отладки, который использует Android Studio, отредактировав конфигурацию отладки . Чтобы узнать больше о различных типах отладки, прочтите раздел об использовании других типов отладки .
Когда Android Studio развертывает ваше приложение на целевом устройстве, открывается окно «Отладка» с вкладкой или представлением сеанса отладки для каждого процесса отладчика, как показано на рис. 6.
При отладке кода C/C++ вы также можете установить специальные типы точек останова, называемые точками наблюдения , которые могут приостанавливать процесс вашего приложения, когда ваше приложение взаимодействует с определенным блоком памяти. Чтобы узнать больше, прочитайте раздел о том, как добавлять точки наблюдения .
Просмотр и настройка точек останова
Чтобы просмотреть все точки останова и настроить их параметры, нажмите «Просмотреть точки останова». в окне отладки. Появится окно Breakpoints, как показано на рисунке 7.
Окно «Точки останова» позволяет включать или отключать каждую точку останова из списка на панели. Если точка останова отключена, Android Studio не приостанавливает работу приложения при достижении этой точки останова.
Выберите точку останова из списка, чтобы настроить ее параметры. Вы можете сначала отключить точку останова, а затем включить ее после достижения другой точки останова. Вы также можете настроить, следует ли отключать точку останова после ее достижения. Чтобы установить точку останова для любого исключения, выберите «Точки останова для исключений» в списке точек останова.
Чтобы временно отключить все точки останова, нажмите «Отключить точки останова». в окне отладки. Нажмите еще раз, чтобы снова включить.
Отладка оконных рамок
В окне «Отладчик» панель «Кадры» позволяет проверить кадр стека, вызвавший попадание в текущую точку останова. Это позволяет вам перемещаться и проверять кадр стека, а также просматривать список потоков в вашем приложении Android.
Чтобы выбрать поток, используйте меню выбора потока и просмотрите его кадр стека. Щелкните элементы в рамке, чтобы открыть исходный код в редакторе. Вы также можете настроить представление потока и экспортировать кадр стека, как описано в руководстве Examine Frames .
Проверка переменных
В окне «Отладчик» панель «Переменные» позволяет проверять переменные, когда система останавливает ваше приложение на точке останова и вы выбираете кадр на панели «Кадры». Панель «Переменные» также позволяет оценивать специальные выражения, используя статические методы и/или переменные, доступные в выбранном фрейме.
Чтобы добавить выражение в дерево объектов (во время отладки приложения):
Альтернативно, если дерево объектов содержит выражение, которое вы хотите отслеживать, вы можете перетащить его в верхнюю часть дерева, чтобы добавить его в качестве отслеживаемого выражения.
Отслеживаемые выражения будут обновляться при достижении точек останова или при выполнении кода.
Вычисленные выражения будут отображаться в верхней части дерева объектов до тех пор, пока вы вручную не вычислите другое выражение или не выполните код.
Чтобы удалить отслеживаемое выражение из дерева объектов, щелкните выражение правой кнопкой мыши и выберите «Удалить наблюдение» .
Добавить точки наблюдения
При отладке кода C/C++ вы можете установить специальные типы точек останова, называемые точками наблюдения , которые могут приостанавливать процесс вашего приложения, когда ваше приложение взаимодействует с определенным блоком памяти. Например, если вы установите два указателя на блок памяти и назначите ему точку наблюдения, использование любого указателя для доступа к этому блоку памяти активирует точку наблюдения.
В Android Studio вы можете создать точку наблюдения во время выполнения, выбрав определенную переменную, но LLDB назначает точку наблюдения только блоку памяти, который система выделяет для этой переменной, а не самой переменной. Это отличается от добавления переменной на панель «Наблюдения», которая позволяет вам наблюдать за значением переменной, но не позволяет приостанавливать процесс приложения, когда система считывает или изменяет ее значение в памяти.
Примечание. Когда процесс вашего приложения завершает функцию и система освобождает локальные переменные из памяти, вам необходимо переназначить все точки наблюдения, созданные вами для этих переменных.
Чтобы установить точку наблюдения, вы должны соответствовать следующим требованиям:
Примечание. При отладке приложения с помощью 32-разрядных ABI ARM добавление точки наблюдения или наведение курсора на переменные внутри кода для изучения их значений может привести к сбою. В качестве обходного пути выполните отладку с использованием 64-разрядных двоичных файлов ARM, x86 или x86_64. Эта проблема будет исправлена в следующем выпуске Android Studio.
Если вы соответствуете требованиям, вы можете добавить точку наблюдения следующим образом:
Чтобы просмотреть все точки наблюдения и настроить параметры точек наблюдения, нажмите «Просмотреть точки останова». в окне отладки. Появится диалоговое окно «Точки останова», как показано на рисунке 10.
После добавления точки наблюдения нажмите «Возобновить программу». в окне «Отладка», чтобы возобновить процесс приложения. По умолчанию, если ваше приложение пытается получить доступ к блоку памяти, для которого вы установили точку наблюдения, система Android приостанавливает процесс вашего приложения и отображает значок точки наблюдения. появляется рядом со строкой кода, которую ваше приложение выполняло последней, как показано на рисунке 11.
Просмотр и изменение формата отображения значения ресурса
В режиме отладки вы можете просматривать значения ресурсов и выбирать другой формат отображения переменных в вашем коде Java или Kotlin. Отобразив вкладку «Переменные» и выбрав фрейм, выполните следующие действия:
Чтобы создать собственный формат, выполните следующие действия: