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:
- Przejdź do Ustawienia > Opcje programisty > Wybierz aplikację do debugowania i wybierz aplikację z listy, a następnie kliknij Czekaj na debuger .
- 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
- Poczekaj, aż aplikacja się załaduje i pojawi się okno dialogowe z informacją, że aplikacja czeka na debuger.
- 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:
- Upewnij się, że obecne są wszystkie artefakty kompilacji (takie jak symbole) wymagane do uruchomienia
lldbclient.py
lublldbclient.py
. - 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. - 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. - Uruchom następującą komendę w terminalu, w którym uruchomiłeś
envsetup.sh
ilunch
: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ę wlaunch.json
i kontynuuje działanie. Jest to oczekiwane; nie zabijaj programulldbclient.py
. Jeśli pominiesz plik--vscode-launch-file
skrypt wydrukuje fragment JSON, który będziesz musiał ręcznie skopiować i wkleić dolaunch.json
.Flaga
-r
musi być ostatnią flagą, jeśli jest obecna, ze względu na sposób analizowania flag przez narzędzie. - 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
. - Po zakończeniu debugowania przejdź do terminala z uruchomionym
lldbclient.py
i naciśnij klawisz Enter , aby zakończyć programlldbclient.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 .