Diese Seite beschreibt die Verwendung von LLDB oder GDB für die Betriebssystementwicklung. Informationen zur App-Entwicklung finden Sie unter Debuggen Ihrer App stattdessen, in der erläutert wird, 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 damit beginnen, das LLDB-Tutorial zu 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
. - Führen Sie denselben
lunch
aus, den Sie beim Erstellen verwendet haben.
Weitere Hilfe beim Einrichten Ihrer Umgebung finden Sie unter Umgebung einrichten .
Debuggen von laufenden Apps oder Prozessen
Um eine Verbindung zu einer laufenden App oder einem nativen Daemon herzustellen, verwenden gdbclient.py
mit einer PID. Um beispielsweise den Prozess mit PID 1234 zu debuggen, führen Sie dies 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 so, dass er Symbole findet, und verbindet ihn mit dem Remote-Debugging-Stub.
Debuggen des nativen Prozessstarts
Um einen Prozess beim Start zu debuggen, verwenden gdbclient.py
mit der Option -r
. Um beispielsweise ls /bin
zu debuggen, führen Sie dies auf dem Host aus:
gdbclient.py -r /system/bin/ls /bin
Geben Sie dann continue
an der Eingabeaufforderung des Debuggers ein.
Debuggen des App-Starts
Manchmal möchten Sie eine App beim Start debuggen, z. B. wenn ein Absturz auftritt, und Sie den Code schrittweise durchlaufen 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 unmöglich, da die App abstürzt, bevor Sie anhängen können. Der logwrapper
Ansatz (der für strace
verwendet wird) funktioniert nicht immer, da die App möglicherweise keine Berechtigungen zum Öffnen eines Ports hat und gdbserver
diese Einschränkung erbt.
Verwenden Sie zum Debuggen des App-Starts 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 und wählen Sie Ihre App aus der Liste aus. Klicken Sie dann auf Auf Debugger warten .
- Starten Sie die App entweder über den Launcher oder über die Befehlszeile, 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 Ihnen mitteilt, dass die App auf einen Debugger wartet.
-
gdbserver
/gdbclient
normal anhängen, Breakpoints setzen, dann den Vorgang fortsetzen.
Damit die App ausgeführt werden kann, fügen 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 Anwendungen oder Prozessen, die abstürzen
Wenn Sie möchten, dass debuggerd abgestürzte Prozesse anhält, damit Sie einen debuggerd
anhängen können, setzen Sie die entsprechende Eigenschaft:
- 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 debuggerd
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 gewählten Befehlssatz festzulegen, 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, der auf Geräten ausgeführt wird, zu steuern und zu debuggen.
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 von
gdbclient.py
oderlldbclient.py
sind, vorhanden sind. - Führen Sie den folgenden Befehl aus:
lldbclient.py --setup-forwarding vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
Dadurch wird ein JSON-Objekt gedruckt und
lldbclient.py
läuft weiter. Dies wird erwartet; Beenden Sie das Programmlldbclient.py
nicht.Das Flag
-r
muss das letzte Flag sein, wenn es vorhanden ist, da Flags vom Tool analysiert werden. - Wählen Sie auf der Registerkarte Debugging in VS Code Konfiguration hinzufügen und dann LLDB: Benutzerdefinierter Start aus. Dadurch wird eine
launch.json
-Datei geöffnet und einer Liste ein neues JSON-Objekt hinzugefügt. - Löschen Sie die neu hinzugefügte Debugger-Konfiguration.
- Kopieren Sie das von
lldbclient.py
gedruckte JSON-Objekt und fügen Sie es in das gerade gelöschte Objekt ein. Speichern Sie die Änderungen. - Um das Fenster zum Aktualisieren der Debugger-Liste neu zu laden, drücken Sie Strg+Umschalt+P und
reload window
. - Wählen Sie die neue Debugger-Konfiguration aus und drücken Sie Ausführen . Der Debugger sollte nach 10 bis 30 Sekunden eine Verbindung herstellen.
- 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.