Debugger verwenden

Auf dieser Seite erfahren Sie, wie Sie LLDB für die Betriebssystementwicklung verwenden. Informationen zur App-Entwicklung finden Sie stattdessen unter App debuggen. Dort wird die Verwendung der Android Studio-GUI (basierend auf LLDB) erläutert.

GDB wird nicht mehr unterstützt oder bereitgestellt. Wenn Sie von GDB zu LLDB wechseln, sollten Sie zuerst das LLDB-Tutorial lesen. Wenn Sie ein erfahrener GDB-Nutzer sind, ist die GDB-zu-LLDB-Befehlszuordnung während der Umstellung sehr hilfreich.

Voraussetzungen

So verwenden Sie einen Debugger:

  • Richten Sie die Buildumgebung mit dem üblichen envsetup.sh-Befehl ein.
  • Führen Sie denselben lunch-Befehl aus, den Sie beim Erstellen verwendet haben. Der Lunch-Artikel muss genau mit dem Gerät übereinstimmen, das Sie debuggen. Wenn das Mittagessen nicht mit dem angeschlossenen Gerät übereinstimmt, wird eine Fehlermeldung angezeigt, die folgendermaßen aussieht: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Verbinden Sie Ihr Gerät mit dem Computer.

Weitere Informationen zum Einrichten Ihrer Umgebung finden Sie unter Umgebung einrichten.

Binärdatei debuggen

Wenn Sie ein Binary debuggen möchten, das Sie auf Ihrem Computer erstellt haben, müssen Sie es zuerst auf das Gerät kopieren und dann den Debugger starten. Beispiel:

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

Ausgeführte Apps oder Prozesse debuggen

Wenn Sie eine Verbindung zu einer laufenden App oder einem nativen Daemon herstellen möchten, verwenden Sie lldbclient.py mit einer PID. Wenn Sie beispielsweise den Prozess mit der PID 1234 debuggen möchten, führen Sie Folgendes auf dem Host aus:

lldbclient.py -p 1234

Das Script richtet die Portweiterleitung ein, startet den entsprechenden Remote-Debugging-Stub auf dem Gerät, startet den Debugger auf dem Host, konfiguriert ihn zum Suchen von Symbolen und verbindet ihn mit dem Remote-Debugging-Stub.

Start von nativen Prozessen debuggen

Wenn Sie einen Prozess beim Starten debuggen möchten, verwenden Sie lldbclient.py mit der Option -r. Wenn Sie beispielsweise ls /bin debuggen möchten, führen Sie auf dem Host Folgendes aus:

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

Geben Sie dann in der Eingabeaufforderung des Debuggers continue ein.

App-Start debuggen

Manchmal möchten Sie eine App beim Starten debuggen, z. B. wenn es zu einem Absturz kommt und Sie den Code Schritt für Schritt 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 etwas anhängen können. Der Ansatz logwrapper (für strace verwendet) funktioniert nicht immer, da die App möglicherweise nicht die Berechtigungen zum Öffnen eines Ports hat und lldbserver diese Einschränkung erbt.

Wenn Sie den App-Start debuggen möchten, können Sie in den Einstellungen über die Entwickleroptionen angeben, dass die App warten soll, bis ein Java-Debugger angehängt wird:

  1. 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.
  2. Starten Sie die App entweder über den Launcher oder über die Befehlszeile:
    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, in dem steht, dass die App auf einen Debugger wartet.
  4. Hängen Sie lldbserver/lldbclient wie gewohnt an, legen Sie Haltestellen fest und fahren Sie dann fort.

Hängen Sie einen JDWP-Debugger (Java Debug Wire Protocol) wie den Java-Debugger (jdb) an, damit die App ausgeführt werden kann:

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

Abstürzende Apps oder Prozesse beheben

Wenn debuggerd abgestürzte Prozesse anhalten soll, 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 gibt debuggerd eine Anleitung zum Kopieren und Einfügen in logcat, wie der Debugger mit dem abgestürzten Prozess verbunden werden kann.

Mit VS Code debuggen

LLDB unterstützt das Debuggen von Plattformcode in Visual Studio Code. Sie können das VS Code-Debugger-Frontend anstelle der LLDB-Befehlszeilenoberfläche verwenden, um nativen Code zu steuern und zu debuggen, der auf Geräten ausgeführt wird.

Bevor Sie VS Code zum Debuggen verwenden, müssen Sie die CodeLLDB-Erweiterung installieren.

So debuggen Sie Code mit VS Code:

  1. Prüfen Sie, ob alle Build-Artefakte (z. B. Symbole) vorhanden sind, die zum Ausführen von lldbclient.py oder lldbclient.py erforderlich sind.
  2. Drücken Sie in VS Code Strg + Umschalttaste + P, um einen Befehl auszuführen. Suchen Sie nach Debug: Konfigurationsdatei hinzufügen und wählen Sie dann LLDB aus. Dadurch wird eine launch.json-Datei geöffnet und einer Liste ein neues JSON-Objekt hinzugefügt.
  3. Ersetzen Sie die neu hinzugefügte Debuggerkonfiguration durch zwei Kommentarzeilen – // #lldbclient-generated-begin und // #lldbclient-generated-end –, sodass Ihre Konfigurationsliste so aussieht:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py verwendet diese Kommentare, um zu ermitteln, wo die Konfiguration geschrieben werden soll. Wenn sich weitere Elemente in der Liste befinden, fügen Sie die Kommentarzeilen am Ende nach den anderen Konfigurationen hinzu.

  4. Führen Sie im Terminal, in dem Sie envsetup.sh und lunch ausgeführt haben, den folgenden Befehl aus:
    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 in launch.json und wird fortgesetzt. Das ist normal. Beenden Sie das lldbclient.py-Programm nicht. Wenn Sie --vscode-launch-file weglassen, gibt das Script das JSON-Snippet aus, das Sie manuell kopieren und in launch.json einfügen müssen.

    Das Flag -r muss das letzte Flag sein, da Flags vom Tool so geparst werden.

  5. Öffnen Sie die Seitenleiste Ausführen und debuggen. Die neue Konfiguration sollte in der Debuggerliste angezeigt werden. Drücken Sie Fehlerbehebung 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, aktualisieren Sie das Fenster, um die Liste der Debugger zu aktualisieren. Drücken Sie dazu Strg + Umschalttaste + P und geben Sie reload window ein.

  6. Wenn Sie mit der Fehlerbehebung fertig sind, rufen Sie das Terminal auf, in dem lldbclient.py ausgeführt wird, und drücken Sie die Eingabetaste, um das lldbclient.py-Programm zu beenden. Bei nachfolgenden Ausführungen des Scripts wird die Konfiguration zwischen den #lldbclient-generated-Kommentaren generiert und der alte Inhalt ersetzt. Sie müssen ihn nicht manuell entfernen.

Mit dem Flag --vscode-launch-props können Sie der generierten Startkonfiguration benutzerdefinierte Properties hinzufügen. Beispiel:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Mit den Beispieleigenschaften führt VS Code vor dem Debuggen eine Aufgabe namens Build aus und fügt den vom Script generierten Schritten einen neuen Debug-Initialisierungsschritt hinzu. Eine Übersicht über die verfügbaren Eigenschaften finden Sie in der VS Code-Dokumentation und im Handbuch der CodeLLDB-Erweiterung.