Korzystanie z debugerów

Ta strona zawiera szczegółowe informacje na temat korzystania z LLDB lub GDB do tworzenia systemu operacyjnego. Aby zapoznać się z tworzeniem aplikacji, zobacz Debugowanie aplikacji , w którym wyjaśniono, jak korzystać z interfejsu GUI Android Studio (opartego na LLDB).

GDB jest przestarzałe i wkrótce zostanie usunięte. Jeśli przełączasz się z GDB na LLDB, prawdopodobnie powinieneś zacząć od przeczytania samouczka LLDB . Jeśli jesteś doświadczonym użytkownikiem GDB, mapa poleceń GDB do LLDB jest bardzo pomocna podczas przejścia.

Warunki wstępne

Aby użyć debugera:

  • Skonfiguruj środowisko kompilacji za pomocą zwykłego polecenia envsetup.sh .
  • Uruchom to samo polecenie lunch , którego użyłeś podczas budowania.

Aby uzyskać więcej pomocy przy konfigurowaniu środowiska, zobacz Konfigurowanie środowiska .

Debugowanie uruchomionych aplikacji lub procesów

Aby połączyć się z uruchomioną aplikacją lub natywnym demonem, użyj gdbclient.py z identyfikatorem PID. Na przykład, aby debugować proces z PID 1234, uruchom to na hoście:

gdbclient.py -p 1234

Skrypt konfiguruje przekierowanie portów, uruchamia odpowiedni kod zdalny debugowania na urządzeniu, uruchamia debuger na hoście, konfiguruje go do wyszukiwania symboli i łączy go ze zdalnym kodem startowym debugowania.

Debugowanie natywnego uruchamiania procesu

Aby debugować proces podczas jego uruchamiania, użyj gdbclient.py z opcją -r . Na przykład, aby debugować ls /bin , uruchom to na hoście:

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

Następnie wpisz continue w monicie debugera.

Debugowanie uruchamiania aplikacji

Czasami chcesz debugować aplikację podczas jej uruchamiania, na przykład w przypadku awarii i chcesz przejść przez kod, aby zobaczyć, co wydarzyło się przed awarią. W niektórych przypadkach dołączanie działa, ale w innych jest niemożliwe, ponieważ aplikacja ulega awarii, zanim będzie można dołączyć. Podejście logwrapper (używane dla strace ) nie zawsze działa, ponieważ aplikacja może nie mieć uprawnień do otwierania portu, a gdbserver dziedziczy to ograniczenie.

Aby debugować uruchamianie aplikacji, użyj opcji programisty w Ustawieniach, aby poinstruować aplikację, aby czekała na podłączenie debugera Java:

  1. Przejdź do Ustawienia > Opcje programisty > Wybierz aplikację do debugowania i wybierz swoją aplikację z listy, a następnie kliknij Poczekaj na debugger .
  2. Uruchom aplikację z programu uruchamiającego lub za pomocą wiersza poleceń, aby uruchomić:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Poczekaj, aż aplikacja się załaduje i pojawi się okno dialogowe z informacją, że aplikacja czeka na debuger.
  4. Podłącz gdbserver / gdbclient normalnie, ustaw punkty przerwania, a następnie kontynuuj proces.

Aby aplikacja mogła działać, dołącz debuger Java Debug Wire Protocol (JDWP), taki jak Java Debugger (jdb):

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

Debugowanie aplikacji lub procesów, które ulegają awarii

Jeśli chcesz, aby debuggerd zawieszał zawieszone procesy, aby można było dołączyć debuger, ustaw odpowiednią właściwość:

  • Po Androidzie 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 i niższy
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow i niższy
    adb shell setprop debug.db.uid 999999
    

Na końcu zwykłych danych wyjściowych dotyczących awarii debuggerd udostępnia instrukcje kopiowania i wklejania w logcat, pokazujące, jak podłączyć debuger do procesu, który uległ awarii.

Debugowanie bez symboli

W przypadku 32-bitowego ARM, jeśli nie masz symboli, gdb nie może określić, który zestaw instrukcji demontuje (ARM lub Thumb). Aby określić zestaw instrukcji wybrany jako domyślny, gdy brakuje informacji o symbolu, ustaw następującą właściwość:

set arm fallback-mode arm  # or thumb

Debugowanie za pomocą VS Code

LLDB obsługuje debugowanie kodu platformy w Visual Studio Code . Możesz użyć frontonu debugera VS Code zamiast interfejsu LLDB CLI do kontrolowania i debugowania kodu natywnego działającego na urządzeniach.

Przed użyciem programu VS Code do debugowania zainstaluj rozszerzenie CodeLLDB .

Aby debugować kod za pomocą VS Code:

  1. Upewnij się, że są obecne wszystkie artefakty kompilacji (takie jak symbole) wymagane do uruchomienia gdbclient.py lub lldbclient.py .
  2. Uruchom następujące polecenie:
    lldbclient.py --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    Spowoduje to wydrukowanie obiektu JSON, a lldbclient.py kontynuuje działanie. Oczekuje się tego; nie zabijaj programu lldbclient.py .

    Flaga -r musi być ostatnią flagą, jeśli jest obecna ze względu na sposób, w jaki flagi są analizowane przez narzędzie.

  3. Na karcie debugowanie w programie VS Code wybierz Dodaj konfigurację , a następnie wybierz LLDB: Uruchamianie niestandardowe . Spowoduje to otwarcie pliku launch.json i dodanie do listy nowego obiektu JSON.
  4. Usuń nowo dodaną konfigurację debugera.
  5. Skopiuj obiekt JSON wydrukowany przez lldbclient.py i wklej go do właśnie usuniętego obiektu. Zapisz zmiany.
  6. Aby ponownie załadować okno w celu odświeżenia listy debuggera, naciśnij Ctrl+Shift+P i wpisz reload window .
  7. Wybierz nową konfigurację debugera i naciśnij run . Debuger powinien połączyć się po 10 do 30 sekundach.
  8. Po zakończeniu debugowania przejdź do terminala z uruchomionym lldbclient.py i naciśnij klawisz Enter , aby zakończyć program lldbclient.py .