Как использовать отладчики

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

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

Требования

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

  • Настройте среду сборки с помощью обычной команды envsetup.sh.
  • Выполните ту же команду lunch, которую использовали при сборке. Обратите внимание, что элемент 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 приостанавливал аварийно завершенные процессы, чтобы вы могли подключить отладчик, задайте соответствующее свойство:

  • После Android 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 вместо интерфейса командной строки 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. Откройте боковую панель Run and Debug (Запуск и отладка). Новая конфигурация должна появиться в списке отладчика. Нажмите Начать отладку (F5). Отладчик должен подключиться через 10–30 секунд.

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

  6. Закончив отладку, перейдите в терминал, в котором выполняется команда lldbclient.py, и нажмите клавишу Ввод, чтобы завершить программу 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.