Использование отладчиков

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

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

Предпосылки

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

  • Настройте среду сборки с помощью обычной команды envsetup.sh .
  • Запустите ту же команду lunch , которую вы использовали при сборке.

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

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

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

gdbclient.py -p 1234

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

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

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

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

Затем введите continue в ответ на приглашение отладчика.

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

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

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

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

Чтобы запустить приложение, подключите отладчик 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, показывающие, как подключить отладчик к аварийному процессу.

Отладка без символов

Для 32-битного ARM, если у вас нет символов, gdb не может определить, какой набор инструкций он дизассемблирует (ARM или Thumb). Чтобы указать набор инструкций, выбранный по умолчанию, когда информация о символе отсутствует, установите следующее свойство:

set arm fallback-mode arm  # or thumb

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

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

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

Для отладки кода с помощью VS Code:

  1. Убедитесь, что присутствуют все артефакты сборки (например, символы), необходимые для запуска gdbclient.py или lldbclient.py .
  2. Выполните следующую команду:
    lldbclient.py --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    Это напечатает объект JSON, и lldbclient.py продолжит работу. Это ожидаемо; не убивайте программу lldbclient.py .

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

  3. На вкладке отладки в VS Code выберите добавить конфигурацию , затем выберите LLDB: Custom Launch . Это открывает файл launch.json и добавляет в список новый объект JSON.
  4. Удалите только что добавленную конфигурацию отладчика.
  5. Скопируйте объект JSON, напечатанный lldbclient.py , и вставьте его в только что удаленный объект. Сохраните изменения.
  6. Чтобы перезагрузить окно и обновить список отладчика, нажмите Ctrl+Shift+P и введите reload window .
  7. Выберите новую конфигурацию отладчика и нажмите « Выполнить ». Отладчик должен подключиться через 10–30 секунд.
  8. Когда вы закончите отладку, перейдите к терминалу, на котором запущен lldbclient.py и нажмите Enter , чтобы завершить программу lldbclient.py .