Auf dieser Seite wird die Verwendung von LLDB oder GDB für die Betriebssystementwicklung beschrieben. Informationen zur App-Entwicklung finden Sie stattdessen unter Debuggen Ihrer App . Dort wird erläutert, wie Sie die Android Studio-GUI (basierend auf LLDB) verwenden.
GDB ist veraltet und wird bald entfernt. Wenn Sie von GDB zu LLDB wechseln, sollten Sie wahrscheinlich zunächst das LLDB-Tutorial lesen. Wenn Sie ein erfahrener GDB-Benutzer sind, ist die Befehlszuordnung von GDB zu LLDB beim Übergang sehr hilfreich.
Voraussetzungen
So verwenden Sie einen Debugger:
- Richten Sie die Build-Umgebung mit dem üblichen Befehl
envsetup.sh
ein. - Führen Sie denselben
lunch
aus, den Sie beim Erstellen verwendet haben. Beachten Sie, dass das Mittagselement genau mit dem Gerät übereinstimmen sollte, das Sie debuggen. Wenn der Mittagsartikel nicht mit dem angeschlossenen Gerät übereinstimmt, erhalten Sie eine Fehlermeldung der Form:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
- Verbinden Sie Ihr Gerät mit der Maschine.
Weitere Hilfe zum Einrichten Ihrer Umgebung finden Sie unter Einrichten der Umgebung .
Debuggen einer Binärdatei
Um eine Binärdatei zu debuggen, die Sie auf Ihrem Computer erstellt haben, müssen Sie die Binärdatei zunächst auf das Gerät kopieren und dann den Debugger starten. Zum Beispiel:
adb push test.exe /data/local/tmp/test.exe
gdbclient.py --port 5038 -r /data/local/tmp/test.exe
Debuggen laufender Apps oder Prozesse
Um eine Verbindung zu einer laufenden App oder einem nativen Daemon herzustellen, verwenden Sie gdbclient.py
mit einer PID. Um beispielsweise den Prozess mit PID 1234 zu debuggen, führen Sie Folgendes auf dem Host aus:
gdbclient.py -p 1234
Das Skript richtet die Portweiterleitung ein, startet den entsprechenden Remote-Debugging-Stub auf dem Gerät, startet den Debugger auf dem Host, konfiguriert ihn für die Suche nach Symbolen und verbindet ihn mit dem Remote-Debugging-Stub.
Debuggen des nativen Prozessstarts
Um einen Prozess beim Start zu debuggen, verwenden Sie gdbclient.py
mit der Option -r
. Um beispielsweise ls /bin
zu debuggen, führen Sie Folgendes auf dem Host aus:
gdbclient.py -r /system/bin/ls /bin
Geben Sie dann an der Eingabeaufforderung des Debuggers continue
ein.
Debuggen des App-Starts
Manchmal möchten Sie eine App beim Start debuggen, beispielsweise wenn es zu einem Absturz kommt und Sie den Code schrittweise durchgehen möchten, um zu sehen, was vor dem Absturz passiert ist. Das Anhängen funktioniert in einigen Fällen, in anderen Fällen ist es jedoch nicht möglich, da die App abstürzt, bevor Sie eine Verbindung herstellen können. Der logwrapper
Ansatz (der für strace
verwendet wird) funktioniert nicht immer, da die App möglicherweise nicht über die Berechtigung zum Öffnen eines Ports verfügt und gdbserver
diese Einschränkung erbt.
Um den App-Start zu debuggen, verwenden Sie die Entwickleroptionen in den Einstellungen, um die App anzuweisen, auf das Anhängen eines Java-Debuggers zu warten:
- Gehen Sie zu Einstellungen > Entwickleroptionen > Debug-App auswählen , wählen Sie Ihre App aus der Liste aus und klicken Sie dann auf Auf Debugger warten .
- Starten Sie die App, entweder über den Launcher oder indem Sie die Befehlszeile verwenden, um Folgendes auszuführen:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- Warten Sie, bis die App geladen ist und ein Dialogfeld angezeigt wird, das Sie darüber informiert, dass die App auf einen Debugger wartet.
- Schließen Sie
gdbserver
/gdbclient
normal an, legen Sie Haltepunkte fest und fahren Sie dann mit dem Vorgang fort.
Um die App laufen zu lassen, schließen Sie einen Java Debug Wire Protocol (JDWP)-Debugger wie Java Debugger (jdb) an:
adb forward tcp:12345 jdwp:XXX # (Where XXX is the PID of the debugged process.)
jdb -attach localhost:12345
Debuggen von Apps oder Prozessen, die abstürzen
Wenn Sie möchten, dass debuggerd
abgestürzte Prozesse anhält, damit Sie einen Debugger anhängen können, legen Sie die entsprechende Eigenschaft fest:
- Nach Android 11
adb shell setprop debug.debuggerd.wait_for_debugger true
- Android 11 und niedriger
adb shell setprop debug.debuggerd.wait_for_gdb true
- Android 6.0 Marshmallow und niedriger
adb shell setprop debug.db.uid 999999
Am Ende der üblichen Absturzausgabe stellt debuggerd
Anweisungen zum Kopieren und Einfügen in Logcat bereit, die zeigen, wie der Debugger mit dem abgestürzten Prozess verbunden wird.
Debuggen ohne Symbole
Wenn Sie für 32-Bit-ARM keine Symbole haben, kann gdb
nicht bestimmen, welchen Befehlssatz es disassembliert (ARM oder Thumb). Um den als Standard ausgewählten Befehlssatz anzugeben, wenn Symbolinformationen fehlen, legen Sie die folgende Eigenschaft fest:
set arm fallback-mode arm # or thumb
Debuggen mit VS-Code
LLDB unterstützt das Debuggen von Plattformcode in Visual Studio Code . Sie können das VS Code-Debugger-Frontend anstelle der LLDB-CLI-Schnittstelle verwenden, um nativen Code zu steuern und zu debuggen, der auf Geräten ausgeführt wird.
Bevor Sie VS Code zum Debuggen verwenden, installieren Sie die CodeLLDB-Erweiterung .
So debuggen Sie Code mit VS-Code:
- Stellen Sie sicher, dass alle Build-Artefakte (z. B. Symbole), die zum Ausführen
gdbclient.py
oderlldbclient.py
erforderlich sind, vorhanden sind. - Drücken Sie in VS Code Strg+Umschalt+P , um einen Befehl auszuführen, suchen Sie nach Debug: Add Configuration... und wählen Sie dann LLDB aus. Dadurch wird eine
launch.json
Datei geöffnet und ein neues JSON-Objekt zu einer Liste hinzugefügt. - Ersetzen Sie die neu hinzugefügte Debugger-Konfiguration durch zwei Kommentarzeilen –
// #lldbclient-generated-begin
und// #lldbclient-generated-end
, sodass Ihre Konfigurationsliste wie folgt aussieht:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
verwendet diese Kommentare, um zu erkennen, wo die Konfiguration geschrieben werden soll. Wenn die Liste weitere Elemente enthält, fügen Sie die Kommentarzeilen am Ende nach den anderen Konfigurationen hinzu. - Führen Sie den folgenden Befehl in dem Terminal aus, in dem Sie
envsetup.sh
undlunch
ausgeführt haben:lldbclient.py --setup-forwarding vscode-lldb \ --vscode-launch-file LAUNCH_JSON_PATH \ ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
lldbclient.py
schreibt die generierte Konfiguration inlaunch.json
und läuft weiter. Dies wird erwartet; Beenden Sie das Programmlldbclient.py
nicht. Wenn Sie die Datei--vscode-launch-file
weglassen, druckt das Skript das JSON-Snippet, das Sie kopieren und manuell inlaunch.json
einfügen müssen.Das Flag
-r
muss das letzte Flag sein, wenn es vorhanden ist, da Flags vom Tool analysiert werden. - Öffnen Sie die Seitenleiste „Ausführen und Debuggen“ – die neue Konfiguration sollte in der Debugger-Liste erscheinen. Drücken Sie Debuggen starten (F5) . Der Debugger sollte nach 10 bis 30 Sekunden eine Verbindung herstellen.
Wenn die neue Konfiguration nicht in der Ansicht „Ausführen und Debuggen“ angezeigt wird, laden Sie das Fenster neu, um die Debugger-Liste zu aktualisieren. Drücken Sie dazu Strg+Umschalt+P und geben Sie
reload window
ein. - Wenn Sie mit dem Debuggen fertig sind, gehen Sie zum Terminal, auf dem
lldbclient.py
ausgeführt wird, und drücken Sie die Eingabetaste, um das Programmlldbclient.py
zu beenden. Nachfolgende Ausführungen des Skripts würden die Konfiguration zwischen den#lldbclient-generated
Kommentaren generieren und die alten Inhalte ersetzen, Sie müssen sie nicht manuell entfernen.
Um benutzerdefinierte Eigenschaften zur generierten Startkonfiguration hinzuzufügen, können Sie das Flag --vscode-launch-props
verwenden. Beispiel:
lldbclient.py --setup-forwarding vscode-lldb \
--vscode-launch-props \
'{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
...
Die Beispieleigenschaften würden VS Code veranlassen, vor dem Debuggen eine Aufgabe namens „ Build
auszuführen und einen neuen Debug-Initialisierungsschritt an die vom Skript generierten Schritte anzuhängen. Eine Übersicht über die verfügbaren Eigenschaften finden Sie in der VS Code-Dokumentation und im Benutzerhandbuch der CodeLLDB-Erweiterung .