Korzystanie z debugerów

Szczegóły tej strony są podane w LLDB w pracy nad systemami operacyjnymi. Informacje o tworzeniu aplikacji znajdziesz tutaj: Debugowanie aplikacji który wyjaśnia, jak korzystać z GUI w Android Studio (opartej na LLDB).

GDB nie jest już obsługiwany ani udostępniany. Jeśli przechodzisz z GDB na LLDB, prawdopodobnie od zapoznania się Samouczek dotyczący LLDB. Jeśli jesteś doświadczonym użytkownikiem GDB, Mapa poleceń z GDB do LLDB jest bardzo pomocne.

Wymagania wstępne

Aby użyć debugera:

  • Skonfiguruj środowisko kompilacji za pomocą zwykłego polecenia envsetup.sh.
  • Uruchom to samo polecenie lunch, które było używane podczas tworzenia. Pamiętaj, że pozycja lunchowa powinien być ściśle zgodny z urządzeniem, które debugujesz. Jeśli danie obiadowe nie pasuje do podłączonego urządzenia, pojawi się błąd formularza: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Podłącz urządzenie do komputera.

Więcej informacji o konfigurowaniu środowiska znajdziesz w Skonfiguruj środowisko.

Debugowanie pliku binarnego

Aby debugować plik binarny utworzony na Twoim komputerze, musisz najpierw skopiować go na urządzenie i uruchomić debuger. Na przykład:

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

Debuguj uruchomione aplikacje lub procesy

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

lldbclient.py -p 1234

Skrypt konfiguruje przekierowanie portów, uruchamia odpowiednie zdalny debuger debugowania na urządzeniu, uruchamia debuger na konfiguruje go w taki sposób, aby znajdował symbole i łączy go do atrapu zdalnego debugowania.

Debugowanie uruchomienia procesu natywnego

Aby debugować rozpoczęty proces, użyj metody lldbclient.py z parametrem -r . Aby na przykład debugować regułę ls /bin, uruchom to na hoście:

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

Następnie w oknie debugera wpisz continue.

Debugowanie uruchamiania aplikacji

Czasem chcesz debugować aplikację od razu po jej uruchomieniu, np. po awarii i chcesz sprawdzić kod, by sprawdzić, co się stało przed awarią. Załączanie czasami działa, ale w innych nie jest możliwe, bo przed załączeniem aplikacji aplikacja ulega awarii. Podejście logwrapper (używane przez strace) nie zawsze działa, ponieważ aplikacja może nie mieć uprawnienia do otwarcia portu, a lldbserver dziedziczy to .

Aby debugować uruchamianie aplikacji, skorzystaj z opcji programisty w Ustawieniach aplikacja, która będzie czekać na dołączenie debugera Java:

  1. Wybierz kolejno Ustawienia > Opcje programisty > Wybierz aplikację do debugowania, a potem kliknij aplikację na liście i kliknij Poczekaj na debugera.
  2. Uruchom aplikację, korzystając z menu z aplikacjami lub z wiersza poleceń:
    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 z informacją, że i czekam na debugera.
  4. Dołącz lldbserver/lldbclient normalnie, ustaw punktów przerwania, a następnie kontynuuj proces.

Aby umożliwić uruchomienie aplikacji, dołącz protokół JDWP (Java Debug Wire Protocol) np. Java Debugger (jdb):

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

Debuguj aplikacje lub procesy, które uległy awarii

Jeśli chcesz, aby usługa debuggerd zawieszała awarie procesów, aby umożliwić Ci dodaj 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 lub starszy
    adb shell setprop debug.db.uid 999999
    

Na końcu typowych danych wyjściowych w przypadku awarii debuggerd udostępnia kopiowanie i wklejanie instrukcje w logcat pokazujące, jak połączyć debuger z procesem, który uległ awarii.

Debuguj za pomocą kodu VS

LLDB obsługuje debugowanie kodu platformy Kod Visual Studio. Zamiast interfejsu wiersza poleceń LLDB możesz używać frontendu debugera kodu VS do na debugowanie kodu natywnego uruchomionego na urządzeniach.

Przed debugowaniem za pomocą VS Code zainstaluj CodeLLDB.

Aby debugować kod za pomocą VS Code:

  1. Sprawdź, czy wszystkie artefakty kompilacji (takie jak symbole) są wymagane do uruchomienia lldbclient.py lub lldbclient.py są obecne.
  2. W VS Code naciśnij Ctrl + Shift + P, aby uruchomić polecenie i wyszukaj Debugowanie: Dodaj konfigurację..., 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, więc że Twoja lista konfiguracji wygląda tak:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py używa tych komentarzy, aby wykryć, gdzie zapisać konfigurację. Jeśli a także inne elementy na liście, dodaj wiersze komentarza na końcu listy po pozostałych konfiguracjach.

  4. Uruchom to polecenie w terminalu, w którym zostały uruchomione polecenia 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 będzie nadal działać. To normalne. nie spowoduje wyłączenia programu lldbclient.py. Jeśli pomiń --vscode-launch-file, skrypt wyświetli fragment kodu JSON, który musisz musisz skopiować i wkleić ręcznie do launch.json.

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

  5. Otwórz pasek boczny Uruchom i debuguj. Nowa konfiguracja powinna się pojawić w listę debugerów. Naciśnij Start Debugging (F5) (Rozpocznij debugowanie). Debuger powinien połączyć się po Od 10 do 30 sekund.

    Jeśli nowa konfiguracja nie pojawiła się w widoku Uruchamianie i debugowanie, załaduj ponownie okno, aby odśwież listę debugerów – naciśnij Ctrl+Shift+P i wpisz reload window

  6. Po zakończeniu debugowania przejdź do uruchomionego terminala lldbclient.py i naciśnij Enter, aby zakończyć Program lldbclient.py. Kolejne uruchomienia skryptu wygenerowałyby konfigurację między komentarzami #lldbclient-generated i zastąpią starą treść, nie musisz usunąć je ręcznie.

Aby dodać właściwości niestandardowe do wygenerowanej konfiguracji uruchamiania, możesz użyć metody flaga --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 skłoniłyby VS Code do uruchomienia zadania o nazwie Build przed debugowaniem i dołącza nowy krok inicjowania debugowania do kroków wygenerowanych przez skrypt. Więcej informacji na ten temat znajdziesz dostępnych miejsc zakwaterowania w VS Code oraz w instrukcji obsługi Rozszerzenie CodeLLDB.