ndk-gdb

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 и их описания.

Запуск ndk-gdb с указанной опцией запускает первое запускаемое действие, указанное в манифесте вашего приложения. Используйте --launch=<name> чтобы запустить следующее запускаемое действие. Чтобы сбросить список запускаемых действий, запустите --launch-list из командной строки.

Вариант Описание>
--lldb

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

--verbose

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

--force По умолчанию ndk-gdb прерывается, если обнаруживает, что на том же устройстве уже запущен другой собственный сеанс отладки. Эта опция убивает другой сеанс и заменяет его новым. Обратите внимание, что этот параметр не уничтожает само отлаживаемое приложение, которое необходимо закрыть отдельно.
--start

Когда вы запускаете ndk-gdb , он по умолчанию пытается подключиться к существующему работающему экземпляру вашего приложения на целевом устройстве. Вы можете переопределить это поведение по умолчанию, используя --start для явного запуска приложения на целевом устройстве перед сеансом отладки.

--launch=<name>

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

--launch-list

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

--project=<path> Этот параметр указывает каталог проекта приложения. Это полезно, если вы хотите запустить сценарий без предварительного перехода в каталог проекта.
--port=<port>

По умолчанию ndk-gdb использует локальный TCP-порт 5039 для связи с приложением, которое он отлаживает на целевом устройстве. Использование другого порта позволяет выполнять отладку программ, работающих на разных устройствах или эмуляторах, подключенных к одному хост-компьютеру.

--adb=<file>

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

  • -d
  • -e
  • -s <serial>
  • Эти флаги аналогичны одноименным командам adb. Установите эти флаги, если к вашему хост-компьютеру подключено несколько устройств или эмуляторов. Их значения следующие:

    -d
    Подключитесь к одному физическому устройству.
    -e
    Подключитесь к одному устройству-эмулятору.
    -s <serial>
    Подключитесь к конкретному устройству или эмулятору. Здесь <serial> — это имя устройства, указанное командой adb devices .

    Альтернативно вы можете определить переменную среды ADB_SERIAL для указания конкретного устройства без необходимости использования конкретной опции.

  • --exec=<file>
  • -x <file>
  • Эта опция указывает ndk-gdb запускать команды инициализации GDB, найденные в <file> после подключения к отлаживаемому процессу. Это полезная функция, если вы хотите сделать что-то повторно, например настроить список точек останова, а затем автоматически возобновить выполнение.

    --nowait

    Отключите приостановку выполнения кода Java до тех пор, пока GDB не подключится. Передача этой опции может привести к тому, что отладчик пропустит ранние точки останова.

    --tui -t

    Включите текстовый пользовательский интерфейс, если он доступен.

    --gnumake-flag=<flag>

    Эта опция представляет собой дополнительный флаг (или флаги), который необходимо передать системе ndk-build при запросе у нее информации о проекте. Вы можете использовать несколько экземпляров этой опции в одной команде.

    Примечание. Последние три параметра в этой таблице относятся только к версии 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.