Plattformcode debuggen

In Android Studio for Platform (ASfP) ist das Debugging von Plattformen in mehreren Sprachen auf dem Tab Attach (Anhängen) im Toolfenster Debug (Debuggen) integriert:

  • Wählen Sie Run > Attach to Android Process (Control+Alt+A) aus, um den Java-Debugger, den nativen Debugger (gebündeltes LLDB) oder beide an eine beliebige laufende App oder einen beliebigen Systemprozess auf einem physischen Gerät oder einem virtuellen Cuttlefish-Gerät anzuhängen.
  • Prüfen Sie jede geladene gemeinsam genutzte Bibliothek (.so) und ihre achtstellige ELF-Build-ID im Bereich Libraries (Bibliotheken), bevor Sie sie anhängen. Die Häkchensymbole bestätigen, dass die lokalen Debugging-Symbole unter out/target/product/<device>/symbols übereinstimmen.
  • Geräteanforderungen über die Symbolleiste verwalten: Filtern Sie mit Systemprozesse anzeigen, klicken Sie auf Gerät mit Root-Zugriff, um adb root auszuführen (bei Aktivierung wird Gerät hat Root-Zugriff angezeigt), und klicken Sie auf JDWP aktivieren, um JDWP für userdebug-Builds zu aktivieren.
  • Sie können bedingte Breakpoints und Ausnahme-Breakpoints festlegen, Inline-Variablenwerte im Editor ansehen, Drop Frame und das intelligente Step Into verwenden und strukturierte C++- und Rust-Typen zur Laufzeit untersuchen.

Bevor Sie den Debugger verwenden, müssen Sie Ihr lunch-Zielvorhaben erstellen, damit der lokale out/target/product/<device>/symbols/.build-id-Symbolindex vorhanden ist, und ein passendes Geräte-Image flashen oder starten.

Java- und duales Java- und natives Debugging

Wenn Sie eine Java- oder Kotlin-Anwendung, eine System-App (z. B. com.android.messaging, Einstellungen oder SystemUI) oder einen Prozess, der JNI- und C++- oder Rust-Code aufruft, debuggen möchten, führen Sie die folgenden Schritte aus:

  1. Legen Sie Haltepunkte in Ihren Java-, Kotlin-, C-, C++- oder Rust-Quelldateien fest.
  2. Wählen Sie Run > Attach to Android Process (Strg+Alt+A) aus. ASfP öffnet im Debug-Toolfenster einen angepinnten Tab Attach (Anhängen).
  3. Wählen Sie im Drop-down-Menü „Gerät“ das Zielgerät aus. Wenn JDWP in einem userdebug-Build nicht aktiviert ist, klicken Sie auf JDWP aktivieren. ASfP legt persist.debug.dalvik.vm.jdwp.enabled=1 fest und startet das Gerät neu. Wenn der Button aktiv ist, wird JDWP enabled (JDWP aktiviert) angezeigt. Mit einem Rechtsklick wird die Aktion Disable JDWP (JDWP deaktivieren) aufgerufen.
  4. Wählen Sie den Zielprozess aus der Tabelle aus. Für Java- und ART-Prozesse wird ein Kaffeetassensymbol angezeigt.
  5. Wählen Sie unten auf dem Tab Attach (Anhängen) Java debugger (Java-Debugger), Native debugger (Nativer Debugger) oder beides aus. Wenn Sie beide auswählen, werden zwei verknüpfte Tabs im Toolfenster Debug geöffnet: <process> (<pid>) für integriertes LLDB und <process> (<pid>)-jdwp für Java. Ihre Lebenszyklen sind miteinander verbunden. Wenn Sie eine der beiden Sitzungen beenden, werden beide beendet.
  6. Klicken Sie auf Anhängen und interagieren Sie mit der App auf Ihrem Gerät, um die Haltepunkte zu erreichen.

Zwei Tabs für Java- und natives Debugging, die neben dem Tab „Attach“ verknüpft sind

Fehlerbehebung und Symbolüberprüfung für Systemprozesse (C und C++)

So debuggen Sie System-Daemons, HALs oder Systemdienste (z. B. android.hardware.bluetooth-service.cuttlefish, surfaceflinger oder audioserver):

  1. Öffnen Sie Run > Attach to Android Process (Strg+Alt+A). Wenn in der Symbolleiste Root Device (gerootetes Gerät) angezeigt wird, klicken Sie darauf, damit ASfP adb root ausgeführt wird und Device is rooted (Gerät ist gerootet) angezeigt wird.
  2. Wählen Sie in der oberen Symbolleiste Systemprozesse anzeigen aus und filtern Sie nach dem Zielprozess.
  3. Lokale Debugging-Symbole im Bereich „Bibliotheken“ prüfen: Wenn Sie einen Prozess auswählen, wird die Tabelle Bibliotheken mit jeder ELF-Bibliothek (.so) gefüllt, die im Prozess geladen wurde, sowie mit den ersten acht hexadezimalen Zeichen der Build-ID der ELF-Datei. ASfP vergleicht jede Build-ID mit out/target/product/<device>/symbols (symbols/.build-id ist erforderlich, um Bibliotheken in APEX-Dateien aufzulösen):
    • Verifizierte Bibliotheken sind mit einem Häkchensymbol gekennzeichnet. Bewegen Sie den Mauszeiger auf eine aufgelöste Zeile, um den vollständigen lokalen .debug-Symbolpfad in der Vorschau zu sehen.
    • Für nicht aufgelöste Bibliotheken ohne übereinstimmende lokale Symbole wird ein Warnsymbol angezeigt.
  4. Erkennung von Nicht-Java-Prozessen: Wenn Sie einen C++- oder Rust-Prozess auswählen (mit einem Sechseck C gekennzeichnet), wird Java-Debugger in ASfP ausgeblendet und Java-Debugging nicht verfügbar, kein Java-Prozess angezeigt, während Nativer Debugger aktiviert bleibt.
  5. Legen Sie Haltepunkte in Ihren C-, C++- oder Rust-Quelldateien fest, klicken Sie auf Attach (Anhängen) und lösen Sie den Codepfad auf dem Gerät aus.

Tab mit der Tabelle „Bibliotheken“, ELF-Build-IDs und Häkchen für lokale Symbole anhängen

Rust-Code debuggen

ASfP debuggt Rust-Plattformcode mit demselben integrierten LLDB-Debugger, der für C und C++ verwendet wird. Es ist kein externer Adapter oder eine manuelle Servereinrichtung erforderlich: ASfP verwendet lldb-dap aus der mitgelieferten Toolchain und lädt automatisch die Rust-Pretty-Printer aus Ihren AOSP-Prebuilts. So werden Standardtypen wie String, Vec, HashMap und Option strukturierte Werte im Bereich Variablen angezeigt.

An einen laufenden Rust-Prozess auf einem Gerät anhängen

Folgen Sie der Anleitung unter Systemprozess-Debugging (C und C++): Öffnen Sie Ausführen > An Android-Prozess anhängen, prüfen Sie, ob Gerät ist gerootet aktiviert ist und lokale Symbole im Bereich Bibliotheken ein Häkchen haben, lassen Sie Nativer Debugger aktiviert und klicken Sie auf Anhängen. Rust- und C- oder C++-Stapelframes werden in derselben Debugging-Sitzung zusammen angezeigt.

Fehler in einem rust_test- oder rust_test_host-Modul beheben

  1. Öffnen Sie die Datei Android.bp, in der ein rust_test- oder rust_test_host-Ziel deklariert ist, und klicken Sie im Gutter neben dem Modultyp auf das Symbol Ausführen.
  2. Wählen Sie Debug '<ModuleName>' aus. ASfP erstellt das Ziel, startet die Testbinärdatei unter LLDB auf Ihrem Hostcomputer oder verbundenen Gerät und hält an Ihren Rust-Haltepunkten an.
  3. Wenn Sie eine einzelne Testfunktion debuggen oder LLDB-Startbefehle anpassen möchten, öffnen Sie Ausführen > Konfigurationen bearbeiten, wählen Sie die generierte Soong-Test-Konfiguration aus und legen Sie Methode fest oder maximieren Sie die Debugger-Optionen. Weitere Informationen zu den Konfigurationsoptionen für Soong Test finden Sie unter Plattformcode mit atest testen.

Rust-Plattformcode mit strukturierten Variablenvisualisierungen in ASfP debuggen