Das NDK enthält ein Shell-Skript namens ndk-gdb
zum Starten eines
native Debugging-Sitzung
über die Befehlszeile ausführen. Nutzende, die lieber eine grafische Benutzeroberfläche verwenden, sollten
Lesen Sie die Dokumentation zum Debugging in
Android Studio.
Voraussetzungen
Damit die native Fehlerbehebung über die Befehlszeile funktioniert, müssen die folgenden Anforderungen erfüllt sein:
- Erstellen Sie Ihre Anwendung mit dem Skript
ndk-build
. Das Skriptndk-gdb
unterstützt nicht die Legacy-Methodemake APP=<name>
zum Erstellen von Builds. - Aktivieren Sie das Debugging für Anwendungen in der Datei
AndroidManifest.xml
, indem Sie ein<application>
-Element, das dasandroid:debuggable
-Attribut auftrue
setzt. - Erstellen Sie Ihre App für Android 2.2 (Android API-Level 8) oder höher.
- Du kannst Fehler auf einem Gerät oder in einem Emulator mit Android 2.2 oder höher beheben.
Zu Debugging-Zwecken
kann das Ziel
Die API-Ebene, die du in der Datei
AndroidManifest.xml
angibst, spielt keine Rolle. - Entwickeln Sie Ihre Anwendung in einer Unix-Shell. Verwenden Sie unter Windows Cygwin.
oder das experimentelle
ndk-gdb-py
Python Implementierung. - Verwenden Sie GNU Make 3.81 oder höher.
Nutzung
Wenn Sie das Skript ndk-gdb
aufrufen möchten, wechseln Sie in das Anwendungsverzeichnis oder ein beliebiges Verzeichnis darunter
. Beispiel:
cd $PROJECT $NDK/ndk-gdb
Hier verweist $PROJECT
auf das Stammverzeichnis Ihres Projekts und $NDK
auf Ihr
NDK-Installationspfad.
Wenn Sie ndk-gdb
aufrufen, wird die Sitzung so konfiguriert, dass nach Ihren Quelldateien gesucht wird
sowie Symbol-/Debug-Versionen Ihrer generierten nativen Bibliotheken. Bei erfolgreichem Anhängen an Ihre
Anwendungsprozess, gibt ndk-gdb
eine lange Reihe von Fehlermeldungen aus und weist darauf hin,
Systembibliotheken finden. Das ist normal, da Ihr Hostcomputer keine
Symbol-/Debug-Versionen dieser Bibliotheken auf deinem Zielgerät. Sie können diese
Nachrichten.
Als Nächstes zeigt ndk-gdb
eine normale GDB-Eingabeaufforderung an.
Sie interagieren mit ndk-gdb
auf dieselbe Weise wie mit GNU GDB. So können Sie zum Beispiel
Verwenden Sie b <location>
, um Haltepunkte festzulegen, und c
(für „Weiter“), um
um die Ausführung fortzusetzen. Eine umfassende Liste der Befehle finden Sie in der
GDB-Handbuch Wenn Sie lieber
den LLDB-Debugger, verwenden Sie den --lldb
beim Aufrufen des Skripts ndk-gdb
.
Beachten Sie, dass der Anwendungsprozess für die Fehlerbehebung beendet wird, wenn Sie die GDB-Eingabeaufforderung schließen. Dieses ist eine GDB-Einschränkung.
ndk-gdb
verarbeitet viele Fehlerbedingungen und zeigt eine informative Fehlermeldung an, wenn
ein Problem findet. Dabei wird unter anderem überprüft, ob die folgenden Bedingungen erfüllt sind:
- Prüft, ob sich ADB in Ihrem Pfad befindet.
- Prüft, ob Ihre Anwendung in ihrem Manifest als debugfähig deklariert ist.
- Überprüft, ob auf dem Gerät die installierte App mit demselben Paketnamen auch ist. Debug-fähig ist.
Standardmäßig sucht ndk-gdb
nach einem bereits laufenden Anwendungsprozess und zeigt eine
wenn keine gefunden wird. Sie können jedoch die --start
oder
--launch=<name>
-Option zum automatischen Starten deiner Aktivität vor der Fehlerbehebung
Sitzung. 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 eine Reihe der am häufigsten verwendeten sowie kurze Beschreibungen.
Ab dem ndk-gdb
mit dieser angegebenen Option wird die erste aufgeführte startbare Aktivität gestartet
in deinem App-Manifest ein. --launch=<name>
verwenden, um das nächste Launchable zu starten
Aktivitäten. Um die Liste der startbaren Aktivitäten zu erstellen, führen Sie --launch-list
über den Befehl aus
Zeile.
Option | Beschreibung > |
---|---|
--lldb |
Wenn dies festgelegt ist, verwendet das Skript für die Sitzung den LLDB-Debugger anstelle von gdb. |
--verbose |
Mit dieser Option wird das Build-System angewiesen, ausführliche Informationen zum nativen Debugging auszugeben
Sitzungseinrichtung. Dies ist nur bei Debugging-Problemen erforderlich, wenn der Debugger keine Verbindung zum
App und die von |
--force |
Standardmäßig wird der Vorgang von ndk-gdb abgebrochen, wenn bereits eine andere native Debugging-Sitzung gefunden wird
auf demselben Gerät ausgeführt werden. Mit dieser Option wird die andere Sitzung beendet und durch eine neue ersetzt.
Beachten Sie, dass diese Option nicht die App, für die das Debugging ausgeführt wird, beendet. Diese müssen Sie
separat. |
--start |
Wenn Sie |
--launch=<name> |
Diese Option ähnelt der Option |
--launch-list |
Mit dieser Option wird eine Liste aller Aktivitätsnamen gedruckt, die Sie in Ihrem
App-Manifests. In „ |
--project=<path> |
Mit dieser Option wird das App-Projektverzeichnis angegeben. Das ist nützlich, wenn Sie den ohne in das Projektverzeichnis wechseln zu müssen. |
--port=<port> |
Standardmäßig verwendet |
--adb=<file> |
Mit dieser Option wird adb angegeben. ausführbar. Dies ist nur erforderlich, wenn Sie den Pfad nicht so festgelegt haben, dass diese ausführbare Datei enthalten ist. |
-d -e -s <serial> |
Diese Flags ähneln den gleichnamigen ADB-Befehlen. Legen Sie diese Flags fest, wenn Sie mehrere Geräte oder Emulatoren, die mit Ihrem Hostcomputer verbunden sind. Ihre Bedeutung hat folgende Bedeutung:
Alternativ können Sie die Umgebungsvariable |
--exec=<file> -x <file> |
Diese Option weist |
--nowait |
Deaktivieren Sie das Pausieren des Java-Codes, bis GDB verbunden ist. Wenn Sie diese Option übergeben, kann der Debugger frühe Haltepunkte zu verpassen. |
--tui
-t |
Text-Benutzeroberfläche aktivieren, falls verfügbar. |
--gnumake-flag=<flag> |
Diese Option ist ein oder mehrere zusätzliche Flags, die an die
|
Hinweis : Die letzten drei Optionen in dieser Tabelle beziehen sich nur auf das
Python-Version von ndk-gdb
.
Thread-Unterstützung
Wenn deine App auf einer Plattform läuft, die älter als Android 2.3 (API-Level 9) ist, ndk-gdb
können native Threads nicht richtig debuggen. Der Debugger kann nur Fehler im Hauptthread beheben,
ignoriert die Ausführung anderer Threads.
Wenn Sie einen Haltepunkt in eine Funktion einfügen, die in einem Nicht-Haupt-Thread ausgeführt wird, wird das Programm beendet und GDB zeigt die folgende Meldung an:
Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists.