Используйте отладчики

На этой странице подробно описано использование LLDB для разработки ОС. Подробнее о разработке приложений см. в разделе Отладка приложения , где объясняется, как использовать графический интерфейс Android Studio (на основе LLDB).

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

Предварительные условия

Чтобы использовать отладчик:

  • Настройте среду сборки с помощью обычной команды envsetup.sh .
  • Запустите ту же команду lunch , которую вы использовали при сборке. Обратите внимание, что элемент обеда должен точно соответствовать устройству, которое вы отлаживаете. Если элемент обеда не соответствует подключенному устройству, вы получите сообщение об ошибке вида: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Подключите ваше устройство к машине.

Дополнительную помощь по настройке среды см. в разделе Настройка среды .

Отладка двоичного файла

Чтобы отладить двоичный файл, созданный на вашем компьютере, сначала вам придется скопировать двоичный файл на устройство, а затем запустить отладчик. Например:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

Отладка запущенных приложений или процессов

Чтобы подключиться к работающему приложению или собственному демону, используйте lldbclient.py с PID. Например, чтобы отладить процесс с PID 1234, запустите это на хосте:

lldbclient.py -p 1234

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

Отладка запуска собственного процесса

Для отладки процесса при его запуске используйте lldbclient.py с опцией -r . Например, для отладки ls /bin запустите это на хосте:

lldbclient.py -r /system/bin/ls /bin

Затем введите continue в командной строке отладчика.

Отладка запуска приложения

Иногда вам нужно отладить приложение при его запуске, например, когда произошел сбой, и вы хотите выполнить пошаговый код, чтобы увидеть, что произошло до сбоя. В некоторых случаях прикрепление работает, но в других случаях невозможно, поскольку приложение аварийно завершает работу до того, как вы сможете его прикрепить. Подход logwrapper (используемый для strace ) не всегда работает, поскольку у приложения может не быть разрешений на открытие порта, а lldbserver наследует это ограничение.

Чтобы отладить запуск приложения, используйте параметры разработчика в настройках, чтобы указать приложению дождаться подключения отладчика Java:

  1. Откройте «Настройки» > «Параметры разработчика» > «Выбрать приложение для отладки» и выберите свое приложение из списка, затем нажмите « Подождать отладчика» .
  2. Запустите приложение либо из панели запуска, либо с помощью командной строки:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Подождите, пока приложение загрузится и появится диалоговое окно, сообщающее, что приложение ожидает отладчика.
  4. Подключите lldbserver / lldbclient как обычно, установите точки останова, затем продолжите процесс.

Чтобы приложение могло работать, подключите отладчик Java Debug Wire Protocol (JDWP), например Java Debugger (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

Отладка приложений или процессов, которые аварийно завершают работу

Если вы хотите, чтобы debuggerd приостанавливал аварийные процессы, чтобы вы могли подключить отладчик, установите соответствующее свойство:

  • После Андроид 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 и более ранние версии
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow и более ранние версии
    adb shell setprop debug.db.uid 999999
    

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

Отладка с помощью VS Code

LLDB поддерживает код платформы отладки в Visual Studio Code . Вы можете использовать интерфейс отладчика VS Code вместо интерфейса CLI LLDB для управления и отладки собственного кода, выполняющегося на устройствах.

Прежде чем использовать VS Code для отладки, установите расширение CodeLLDB .

Чтобы отладить код с помощью VS Code:

  1. Убедитесь, что все артефакты сборки (например, символы), необходимые для запуска lldbclient.py или lldbclient.py присутствуют.
  2. В VS Code нажмите Ctrl+Shift+P, чтобы запустить команду, найдите Debug: Add Configuration... , затем выберите LLDB . При этом открывается файл launch.json и в список добавляется новый объект JSON.
  3. Замените вновь добавленную конфигурацию отладчика двумя строками комментариев — // #lldbclient-generated-begin и // #lldbclient-generated-end , чтобы ваш список конфигурации выглядел следующим образом:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

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

  4. Запустите следующую команду в терминале, где вы запустили envsetup.sh и lunch :
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py записывает сгенерированную конфигурацию в launch.json и продолжает работу. Это ожидаемо; не уничтожайте программу lldbclient.py . Если вы опустите --vscode-launch-file скрипт напечатает фрагмент JSON, который вам нужно будет скопировать и вставить в launch.json вручную.

    Флаг -r должен быть последним, если он присутствует, из-за того, как флаги анализируются инструментом.

  5. Откройте боковую панель «Выполнение и отладка» — новая конфигурация должна появиться в списке отладчика. Нажмите «Начать отладку» (F5) . Отладчик должен подключиться через 10–30 секунд.

    Если новая конфигурация не появилась в представлении «Выполнение и отладка», перезагрузите окно, чтобы обновить список отладчика — нажмите Ctrl+Shift+P и введите reload window .

  6. Когда вы закончите отладку, перейдите к терминалу, на котором запущен lldbclient.py , и нажмите Enter , чтобы завершить программу lldbclient.py . Последующие запуски сценария будут генерировать конфигурацию между комментариями #lldbclient-generated и заменять старое содержимое; вам не нужно удалять их вручную.

Чтобы добавить пользовательские свойства в сгенерированную конфигурацию запуска, вы можете использовать флаг --vscode-launch-props . Например:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Свойства примера заставят VS Code запускать задачу с именем Build перед отладкой и добавлять новый шаг инициализации отладки к шагам, созданным сценарием. Обзор доступных свойств вы можете найти в документации VS Code и в Руководстве пользователя расширения CodeLLDB .