ndk-gdb

Das NDK enthält ein Shell-Script namens ndk-gdb, mit dem eine native Befehlszeilen-Debugging-Sitzung gestartet wird (früher gdb, jetzt lldb). Nutzer, die lieber eine Benutzeroberfläche verwenden, sollten stattdessen die Dokumentation zum Debugging in Android Studio lesen.

Voraussetzungen

Damit das native Debuggen über die Befehlszeile funktioniert, müssen die folgenden Anforderungen erfüllt sein:

  • Erstellen Sie Ihre App mit dem ndk-build-Script. Das ndk-gdb-Script unterstützt nicht die Verwendung der alten make APP=<name>-Methode für den Build.
  • Aktivieren Sie das App-Debugging in Ihrer AndroidManifest.xml-Datei, indem Sie ein <application>-Element einfügen, das das android:debuggable-Attribut auf true festlegt.
  • Ihre App muss für Android 2.2 (Android API-Level 8) oder höher entwickelt sein.
  • Debuggen auf einem Gerät oder Emulator mit Android 2.2 oder höher Für die Fehlerbehebung spielt die in der AndroidManifest.xml-Datei angegebene Ziel-API-Ebene keine Rolle.
  • Entwickeln Sie Ihre App in einer Unix-Shell. Verwenden Sie unter Windows Cygwin oder die experimentelle ndk-gdb-py-Implementierung von Python.
  • Verwenden Sie GNU Make 3.81 oder höher.

Nutzung

Wenn Sie das ndk-gdb-Script aufrufen möchten, wechseln Sie in das Anwendungsverzeichnis oder ein beliebiges untergeordnetes Verzeichnis. Beispiel:

cd $PROJECT
$NDK/ndk-gdb

Hier verweist $PROJECT auf das Stammverzeichnis Ihres Projekts und $NDK auf den Installationspfad des NDK.

Wenn Sie ndk-gdb aufrufen, wird die Sitzung so konfiguriert, dass nach Ihren Quelldateien und Symbol-/Debugversionen Ihrer generierten nativen Bibliotheken gesucht wird. Nachdem ndk-gdb eine Verbindung zum Anwendungsvorgang hergestellt hat, gibt es eine lange Reihe von Fehlermeldungen aus, in denen angegeben wird, dass verschiedene Systembibliotheken nicht gefunden werden können. Das ist normal, da Ihr Hostcomputer keine Symbol-/Debugversionen dieser Bibliotheken auf Ihrem Zielgerät enthält. Sie können diese Meldungen ignorieren.

Als Nächstes wird mit ndk-gdb der übliche lldb-Prompt angezeigt.

Die Interaktion mit ndk-gdb erfolgt genauso wie mit lldb. Wenn Sie mit lldb nicht vertraut sind, aber gdb kennen, sehen Sie sich die hilfreiche [GDB-zu-LLDB-Befehlszuordnung](https://lldb.llvm.org/use/map.html) an.

ndk-gdb verarbeitet viele Fehlerbedingungen und zeigt eine informative Fehlermeldung an, wenn ein Problem gefunden wird. Bei diesen Prüfungen wird unter anderem geprüft, ob die folgenden Bedingungen erfüllt sind:

  • Prüft, ob ADB in Ihrem Pfad enthalten ist.
  • Prüft, ob Ihre Anwendung im Manifest als debugfähig deklariert ist.
  • Prüft, ob die installierte App mit demselben Paketnamen auf dem Gerät auch debugbar ist.

Standardmäßig sucht ndk-gdb nach einem bereits laufenden Anwendungsvorgang und zeigt einen Fehler an, wenn keiner gefunden wird. Sie können jedoch die Option --start oder --launch=<name> verwenden, um Ihre Aktivität automatisch vor der Debug-Sitzung zu starten. Weitere Informationen finden Sie unter Optionen.

Optionen

Geben Sie ndk-gdb --help in die Befehlszeile ein, um eine vollständige Liste der Optionen aufzurufen. Tabelle 1 enthält einige der am häufigsten verwendeten Typen mit kurzen Beschreibungen.

Tabelle 1 Gängige ndk-gdb-Optionen und ihre Beschreibungen

Wenn Sie ndk-gdb mit dieser Option starten, wird die erste ausführbare Aktivität gestartet, die in Ihrem Anwendungsmanifest aufgeführt ist. Mit --launch=<name> können Sie die nächste ausführbare Aktivität starten. Wenn Sie eine Liste der ausführbaren Aktivitäten aufrufen möchten, führen Sie --launch-list in der Befehlszeile aus.

Option Beschreibung>
--verbose

Mit dieser Option wird das Build-System angewiesen, ausführliche Informationen zur Konfiguration der nativen Debugging-Sitzung auszudrucken. Sie ist nur für die Behebung von Problemen erforderlich, wenn der Debugger keine Verbindung zur App herstellen kann und die Fehlermeldungen, die ndk-gdb anzeigt, nicht ausreichen.

--force Standardmäßig wird ndk-gdb abgebrochen, wenn bereits eine andere native Debug-Sitzung auf demselben Gerät ausgeführt wird. Mit dieser Option wird die andere Sitzung beendet und durch eine neue ersetzt. Hinweis: Mit dieser Option wird die zu debuggende App nicht beendet. Sie müssen sie separat beenden.
--start

Wenn Sie ndk-gdb starten, versucht das Programm standardmäßig, eine Verbindung zu einer vorhandenen laufenden Instanz Ihrer App auf dem Zielgerät herzustellen. Sie können dieses Standardverhalten überschreiben, indem Sie die Anwendung vor der Debug-Sitzung mit --start explizit auf dem Zielgerät starten.

--launch=<name>

Diese Option ähnelt --start, mit der Ausnahme, dass Sie damit eine bestimmte Aktivität über Ihre Anwendung starten können. Diese Funktion ist nur nützlich, wenn Ihr Manifest mehrere startbare Aktivitäten definiert.

--launch-list

Mit dieser praktischen Option wird eine Liste aller Namen von ausführbaren Aktivitäten ausgegeben, die in Ihrem App-Manifest enthalten sind. --start verwendet den Namen der ersten Aktivität.

--project=<path> Mit dieser Option wird das Verzeichnis des App-Projekts angegeben. Das ist nützlich, wenn Sie das Script starten möchten, ohne zuerst zum Projektverzeichnis wechseln zu müssen.
--port=<port>

Standardmäßig verwendet ndk-gdb den lokalen TCP-Port 5039, um mit der App zu kommunizieren, die auf dem Zielgerät debuggt wird. Wenn Sie einen anderen Port verwenden, können Sie Programme, die auf verschiedenen Geräten oder Emulatoren ausgeführt werden, die mit demselben Hostcomputer verbunden sind, nativ debuggen.

--adb=<file>

Mit dieser Option wird die ausführbare Datei des adb-Tools angegeben. Dies ist nur erforderlich, wenn Sie den Pfad nicht so festgelegt haben, dass er diese ausführbare Datei enthält.

  • -d
  • -e
  • -s <serial>
  • Diese Flags ähneln den adb-Befehlen mit denselben Namen. Legen Sie diese Flags fest, wenn mehrere Geräte oder Emulatoren mit Ihrem Hostcomputer verbunden sind. Die Bedeutungen sind:

    -d
    Verbinden Sie sich mit einem einzelnen physischen Gerät.
    -e
    Verbinden Sie sich mit einem einzelnen Emulatorgerät.
    -s <serial>
    Verbinden Sie sich mit einem bestimmten Gerät oder Emulator. Hier ist <serial> der Name des Geräts, wie er vom Befehl adb devices aufgeführt wird.

    Alternativ können Sie die Umgebungsvariable ADB_SERIAL so definieren, dass ein bestimmtes Gerät aufgeführt wird, ohne dass eine bestimmte Option erforderlich ist.

  • --exec=<file>
  • -x <file>
  • Mit dieser Option wird ndk-gdb angewiesen, die Debugger-Initialisierungsbefehle in <file> auszuführen, nachdem eine Verbindung zum zu debuggenden Prozess hergestellt wurde. Diese Funktion ist nützlich, wenn Sie etwas wiederholt ausführen möchten, z. B. eine Liste von Haltepunkten einrichten und die Ausführung dann automatisch fortsetzen.

    --nowait

    Deaktivieren Sie das Pausieren des Java-Codes, bis der Debugger eine Verbindung herstellt. Wenn Sie diese Option übergeben, kann es passieren, dass der Debugger frühe Haltestellen überspringt.

    --tui -t

    Aktivieren Sie die Textoberfläche, falls verfügbar.

    --gnumake-flag=<flag>

    Diese Option ist ein zusätzliches Flag (oder mehrere zusätzliche Flags), das bzw. die an das ndk-build-System übergeben werden, wenn es um Projektinformationen abgefragt wird. Sie können diese Option mehrmals im selben Befehl verwenden.

    Hinweis : Die letzten drei Optionen in dieser Tabelle gelten nur für die Python-Version von ndk-gdb.