Korzystanie z debugerów

Na tej stronie znajdują się szczegółowe informacje dotyczące wykorzystania LLDB do tworzenia systemów operacyjnych. Aby zapoznać się z tworzeniem aplikacji, zobacz Debugowanie aplikacji , w którym wyjaśniono, jak korzystać z interfejsu GUI systemu Android Studio (opartego na LLDB).

GDB nie jest już obsługiwany ani udostępniany. 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. Pamiętaj, że element lunchu powinien dokładnie pasować do debugowanego urządzenia. Jeśli lunch nie pasuje do podłączonego urządzenia, pojawi się błąd w postaci: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Podłącz swoje urządzenie do maszyny.

Aby uzyskać dodatkową pomoc dotyczącą konfigurowania środowiska, zobacz Konfigurowanie środowiska .

Debugowanie pliku binarnego

Aby debugować plik binarny utworzony na swoim komputerze, najpierw musisz skopiować plik binarny na urządzenie, a następnie uruchomić debuger. Na przykład:

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

Debugowanie uruchomionych aplikacji lub procesów

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

lldbclient.py -p 1234

Skrypt konfiguruje przekierowanie portów, uruchamia odpowiedni odcinek zdalnego debugowania na urządzeniu, uruchamia debuger na hoście, konfiguruje go tak, aby znajdował symbole i łączy go ze odcinkiem zdalnego debugowania.

Debugowanie uruchamiania procesów natywnych

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

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

Następnie wprowadź continue w wierszu poleceń debugera.

Debugowanie uruchamiania aplikacji

Czasami chcesz debugować aplikację zaraz po uruchomieniu, na przykład po awarii i chcesz przejść przez kod, aby zobaczyć, co wydarzyło się przed awarią. Dołączanie działa w niektórych przypadkach, ale w innych przypadkach jest niemożliwe, ponieważ aplikacja ulega awarii, zanim będzie można dołączyć. Metoda logwrapper (używana w przypadku strace ) nie zawsze działa, ponieważ aplikacja może nie mieć uprawnień do otwierania portu, a lldbserver 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 aplikację z listy, a następnie kliknij Czekaj na debuger .
  2. Uruchom aplikację z poziomu 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 normalnie lldbserver / lldbclient , ustaw punkty przerwania, a następnie kontynuuj proces.

Aby aplikacja mogła działać, podłącz debuger protokołu 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 móc podłączyć debuger, ustaw odpowiednią właściwość:

  • Po Androidzie 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 i starsze
    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łego wyniku awarii debuggerd udostępnia instrukcje kopiowania i wklejania w logcat pokazujące, jak podłączyć debuger do procesu, który uległ awarii.

Debugowanie za pomocą kodu VS

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

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

Aby debugować kod za pomocą kodu VS:

  1. Upewnij się, że obecne są wszystkie artefakty kompilacji (takie jak symbole) wymagane do uruchomienia lldbclient.py lub lldbclient.py .
  2. W VS Code naciśnij Ctrl+Shift+P , aby uruchomić polecenie, wyszukaj Debug: Add Configuration... , a następnie wybierz LLDB . Spowoduje to otwarcie pliku launch.json i dodanie nowego obiektu JSON do listy.
  3. Zastąp nowo dodaną konfigurację debugera dwoma wierszami komentarza - // #lldbclient-generated-begin i // #lldbclient-generated-end , aby lista konfiguracji wyglądała następująco:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py używa tych komentarzy do wykrywania, gdzie zapisać konfigurację. Jeśli na liście znajdują się inne pozycje, dodaj linie komentarza na końcu po innych konfiguracjach.

  4. Uruchom następującą komendę w terminalu, w którym uruchomiłeś envsetup.sh i lunch :
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py zapisuje wygenerowaną konfigurację w launch.json i kontynuuje działanie. Jest to oczekiwane; nie zabijaj programu lldbclient.py . Jeśli pominiesz plik --vscode-launch-file skrypt wydrukuje fragment JSON, który będziesz musiał ręcznie skopiować i wkleić do launch.json .

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

  5. Otwórz pasek boczny Uruchom i debuguj — nowa konfiguracja powinna pojawić się na liście debugera. Naciśnij Rozpocznij debugowanie (F5) . Debuger powinien połączyć się po 10–30 sekundach.

    Jeżeli nowa konfiguracja nie pojawiła się w widoku Uruchom i debuguj, załaduj ponownie okno, aby odświeżyć listę debuggerów - naciśnij Ctrl+Shift+P i wpisz reload window .

  6. Po zakończeniu debugowania przejdź do terminala z uruchomionym lldbclient.py i naciśnij klawisz Enter , aby zakończyć program lldbclient.py . Kolejne uruchomienia skryptu wygenerowałyby konfigurację pomiędzy komentarzami #lldbclient-generated i zastąpiły starą zawartość. Nie trzeba ich usuwać ręcznie.

Aby dodać niestandardowe właściwości do wygenerowanej konfiguracji uruchamiania, możesz użyć flagi --vscode-launch-props . Na przykład:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Przykładowe właściwości sprawią, że VS Code uruchomi zadanie o nazwie Build przed debugowaniem i dołączy nowy krok inicjalizacji debugowania do kroków wygenerowanych przez skrypt. Przegląd dostępnych właściwości można znaleźć w dokumentacji VS Code oraz w Podręczniku użytkownika rozszerzenia CodeLLDB .