NDK включает в себя сценарий оболочки с именем ndk-gdb
для запуска собственного сеанса отладки из командной строки. Пользователям, которые предпочитают использовать графический интерфейс, вместо этого следует прочитать документацию по отладке в Android Studio .
Требования
Для работы встроенной отладки из командной строки должны быть выполнены следующие требования:
- Создайте свое приложение с помощью сценария
ndk-build
. Сценарийndk-gdb
не поддерживает использование устаревшего методаmake APP=<name>
для сборки. - Включите отладку приложения в файле
AndroidManifest.xml
, включив элемент<application>
, который устанавливает для атрибутаandroid:debuggable
значениеtrue
. - Создайте свое приложение для работы на Android 2.2 (уровень Android API 8) или выше.
- Отладка на устройстве или эмуляторе под управлением Android 2.2 или более поздней версии. Для целей отладки целевой уровень API, объявленный в файле
AndroidManifest.xml
не имеет значения. - Разработайте свое приложение в оболочке Unix. В Windows используйте Cygwin или экспериментальную реализацию Python
ndk-gdb-py
. - Используйте GNU Make 3.81 или выше.
Использование
Чтобы вызвать сценарий ndk-gdb
, перейдите в каталог приложения или любой каталог под ним. Например:
cd $PROJECT $NDK/ndk-gdb
Здесь $PROJECT
указывает на корневой каталог вашего проекта, а $NDK
указывает на путь установки NDK.
Когда вы вызываете ndk-gdb
, он настраивает сеанс для поиска исходных файлов и версий символов/отладки созданных вами собственных библиотек. При успешном подключении к процессу приложения ndk-gdb
выводит длинную серию сообщений об ошибках, отмечая, что не может найти различные системные библиотеки. Это нормально, поскольку ваш хост-компьютер не содержит символьных/отладочных версий этих библиотек на целевом устройстве. Вы можете смело игнорировать эти сообщения.
Затем ndk-gdb
отображает обычное приглашение GDB.
Вы взаимодействуете с ndk-gdb
так же, как и с GNU GDB. Например, вы можете использовать b <location>
для установки точек останова и c
(для «продолжения») для возобновления выполнения. Полный список команд смотрите в руководстве GDB. Если вы предпочитаете использовать отладчик LLDB , используйте параметр --lldb
при вызове сценария ndk-gdb
.
Обратите внимание: когда вы выходите из приглашения GDB, процесс приложения, который вы отлаживаете, останавливается. Такое поведение является ограничением GDB.
ndk-gdb
обрабатывает множество ошибок и отображает информативное сообщение об ошибке, если обнаруживает проблему. эти проверки включают проверку выполнения следующих условий:
- Проверяет, что ADB находится на вашем пути.
- Проверяет, что ваше приложение объявлено в манифесте отлаживаемым.
- Проверяет, что на устройстве установленное приложение с тем же именем пакета также является отлаживаемым.
По умолчанию ndk-gdb
ищет уже запущенный процесс приложения и отображает ошибку, если его не находит. Однако вы можете использовать параметр --start
или --launch=<name>
, чтобы автоматически запускать действие перед сеансом отладки. Дополнительную информацию см. в разделе «Параметры» .
Параметры
Чтобы просмотреть полный список параметров, введите ndk-gdb --help
в командной строке. В таблице 1 показаны некоторые наиболее часто используемые из них с краткими описаниями.
Таблица 1. Распространенные параметры ndk-gdb и их описания.
Вариант | Описание> |
---|---|
--lldb | Если установлено, сценарий будет использовать для сеанса отладчик LLDB вместо gdb. |
--verbose | Этот параметр указывает системе сборки печатать подробную информацию о настройке сеанса встроенной отладки. Это необходимо только для проблем отладки, когда отладчик не может подключиться к приложению, а сообщений об ошибках, отображаемых |
--force | По умолчанию ndk-gdb прерывается, если обнаруживает, что на том же устройстве уже запущен другой собственный сеанс отладки. Эта опция убивает другой сеанс и заменяет его новым. Обратите внимание, что этот параметр не уничтожает само отлаживаемое приложение, которое необходимо закрыть отдельно. |
--start | Когда вы запускаете |
--launch=<name> | Эта опция аналогична |
--launch-list | Эта удобная опция распечатывает список всех имен запускаемых действий, найденных в манифесте вашего приложения. |
--project=<path> | Этот параметр указывает каталог проекта приложения. Это полезно, если вы хотите запустить сценарий без предварительного перехода в каталог проекта. |
--port=<port> | По умолчанию |
--adb=<file> | Этот параметр указывает исполняемый файл инструмента adb . Это необходимо только в том случае, если вы не указали путь для включения этого исполняемого файла. |
-d -e -s <serial> | Эти флаги аналогичны одноименным командам adb. Установите эти флаги, если к вашему хост-компьютеру подключено несколько устройств или эмуляторов. Их значения следующие:
Альтернативно вы можете определить переменную среды |
--exec=<file> -x <file> | Эта опция указывает |
--nowait | Отключите приостановку выполнения кода Java до тех пор, пока GDB не подключится. Передача этой опции может привести к тому, что отладчик пропустит ранние точки останова. |
--tui -t | Включите текстовый пользовательский интерфейс, если он доступен. |
--gnumake-flag=<flag> | Эта опция представляет собой дополнительный флаг (или флаги), который необходимо передать системе |
Примечание. Последние три параметра в этой таблице относятся только к версии ndk-gdb
для Python.
Поддержка потоков
Если ваше приложение работает на платформе старше Android 2.3 (уровень API 9), ndk-gdb
не сможет правильно отлаживать собственные потоки. Отладчик может отлаживать только основной поток, abd полностью игнорирует выполнение других потоков.
Если вы поместите точку останова на функцию, выполняемую в неосновном потоке, программа завершит работу, и GDB отобразит следующее сообщение:
Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists.