Verwenden von Debuggern

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:

  1. 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 .
  2. 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
    
  3. Warten Sie, bis die App geladen ist und ein Dialogfeld angezeigt wird, das Ihnen mitteilt, dass die App auf einen Debugger wartet.
  4. 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:

  1. Stellen Sie sicher, dass alle Build-Artefakte (z. B. Symbole), die zum Ausführen von gdbclient.py oder lldbclient.py sind, vorhanden sind.
  2. 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 Programm lldbclient.py nicht.

    Das Flag -r muss das letzte Flag sein, wenn es vorhanden ist, da Flags vom Tool analysiert werden.

  3. 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.
  4. Löschen Sie die neu hinzugefügte Debugger-Konfiguration.
  5. 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.
  6. Um das Fenster zum Aktualisieren der Debugger-Liste neu zu laden, drücken Sie Strg+Umschalt+P und reload window .
  7. 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.
  8. 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 Programm lldbclient.py zu beenden.