Verwenden von Debuggern

Auf dieser Seite wird die Verwendung von LLDB 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 wird nicht mehr unterstützt oder bereitgestellt. 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
lldbclient.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 lldbclient.py mit einer PID. Um beispielsweise den Prozess mit PID 1234 zu debuggen, führen Sie Folgendes auf dem Host aus:

lldbclient.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 lldbclient.py mit der Option -r . Um beispielsweise ls /bin zu debuggen, führen Sie Folgendes auf dem Host aus:

lldbclient.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 lldbserver diese Einschränkung übernimmt.

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:

  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 indem Sie die Befehlszeile verwenden, 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 Sie darüber informiert, dass die App auf einen Debugger wartet.
  4. Schließen Sie lldbserver / lldbclient 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 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:

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

  4. Führen Sie den folgenden Befehl in dem Terminal aus, in dem Sie envsetup.sh und lunch 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 in launch.json und läuft weiter. Dies wird erwartet; Beenden Sie das Programm lldbclient.py nicht. Wenn Sie die Datei --vscode-launch-file weglassen, druckt das Skript das JSON-Snippet, das Sie kopieren und manuell in launch.json einfügen müssen.

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

  5. Ö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.

  6. 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. 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 .