L'NDK include uno script shell denominato ndk-gdb
per avviare un
sessione di debug nativa dalla riga di comando. Gli utenti che preferiscono utilizzare una GUI devono:
leggi la documentazione per il debug in
Android Studio.
Requisiti
Affinché il debug nativo dalla riga di comando funzioni, devono essere soddisfatti i seguenti requisiti:
- Crea la tua app utilizzando lo script
ndk-build
. Lo scriptndk-gdb
non supporta l'utilizzo del metodomake APP=<name>
precedente per la creazione. - Attiva il debug delle app nel file
AndroidManifest.xml
includendo un elemento Elemento<application>
che imposta l'attributoandroid:debuggable
sutrue
. - Crea l'app in modo che venga eseguita su Android 2.2 (livello API Android 8) o versioni successive.
- Esegui il debug su un dispositivo o un emulatore con Android 2.2 o versioni successive.
Ai fini del debug, la destinazione
Il livello API dichiarato nel file
AndroidManifest.xml
non è importante. - Sviluppa la tua app in una shell Unix. Su Windows, utilizza Cygwin
oppure la versione sperimentale
ndk-gdb-py
Python implementazione. - Usa GNU Make 3.81 o versioni successive.
Utilizzo
Per richiamare lo script ndk-gdb
, passa alla directory dell'applicazione o a qualsiasi directory in
li annotino. Ad esempio:
cd $PROJECT $NDK/ndk-gdb
Qui, $PROJECT
punta alla directory principale del progetto e $NDK
punta alla directory
Percorso di installazione NDK.
Quando richiami ndk-gdb
, la sessione viene configurata per cercare i file di origine
e le versioni di simboli/debug delle librerie native generate. Una volta eseguito il collegamento
processo dell'applicazione, ndk-gdb
restituisce una lunga serie di messaggi di errore, indicando che non
trovare varie librerie di sistema. Questo è normale, perché la macchina host non contiene
di queste librerie sul dispositivo di destinazione. Puoi ignorare tranquillamente questi
messaggi.
Successivamente, ndk-gdb
mostra un normale prompt di GDB.
Interagisci con ndk-gdb
come faresti con GNU GDB. Ad esempio, puoi
utilizza b <location>
per impostare punti di interruzione e c
(per "continua") per
e riprendere l'esecuzione. Per un elenco completo dei comandi, vedi
Manuale di GDB. Se preferisci utilizzare
Il debugger LLDB, utilizza lo --lldb
quando richiami lo script ndk-gdb
.
Tieni presente che quando esci dal prompt di GDB, il processo dell'applicazione che stai eseguendo il debug si arresta. Questo è un limite di gdb.
ndk-gdb
gestisce molte condizioni di errore e, se necessario, visualizza un messaggio di errore informativo
individua un problema. tra cui verificare che siano soddisfatte le seguenti condizioni:
- Controlla che ADB sia nel tuo percorso.
- Controlla che la tua applicazione sia dichiarata di cui è possibile eseguire il debug nel file manifest.
- Controlla che, sul dispositivo, anche l'applicazione installata con lo stesso nome di pacchetto sia di cui è possibile eseguire il debug.
Per impostazione predefinita, ndk-gdb
cerca un processo dell'applicazione già in esecuzione e visualizza
se non ne trova. Tuttavia, puoi utilizzare la --start
o
Opzione --launch=<name>
per avviare automaticamente la tua attività prima del debug
durante la sessione. Per ulteriori informazioni, vedi Opzioni.
Opzioni
Per visualizzare un elenco completo delle opzioni, digita ndk-gdb --help
nella riga di comando. Tabella 1
mostra una serie di quelle più usate, oltre a brevi descrizioni.
A partire dal giorno ndk-gdb
con questa opzione specificata, verrà avviata la prima attività avviabile elencata
nel file manifest dell'applicazione. Usa --launch=<name>
per avviare il prossimo lancio
attività. Per eseguire il dump dell'elenco delle attività avviabili, esegui --launch-list
dal comando
dalla riga di comando.
Opzione | Descrizione> |
---|---|
--lldb |
Se impostato, lo script utilizzerà il debugger LLDB per la sessione anziché gdb. |
--verbose |
Questa opzione indica al sistema di compilazione di stampare informazioni dettagliate sul debug nativo
durante la configurazione della sessione. È necessaria solo per il debug dei problemi quando il debugger non riesce a connettersi al
e i messaggi di errore visualizzati da |
--force |
Per impostazione predefinita, ndk-gdb si interrompe se rileva che è già in corso un'altra sessione di debug nativa
in esecuzione sullo stesso dispositivo. Questa opzione termina l'altra sessione e la sostituisce con una nuova.
Tieni presente che questa opzione non termina l'app effettiva in fase di debug, che devi terminare.
separatamente. |
--start |
Quando lo avvii, |
--launch=<name> |
Questa opzione è simile a |
--launch-list |
Questa opzione di praticità visualizza l'elenco di tutti i nomi di attività avviabili trovati nel tuo
manifest dell'app. |
--project=<path> |
Questa opzione specifica la directory del progetto dell'app. È utile se vuoi avviare senza dover prima passare alla directory del progetto. |
--port=<port> |
Per impostazione predefinita, |
--adb=<file> |
Questa opzione specifica l'elemento adb eseguibile dello strumento. Questa operazione è necessaria solo se non hai impostato il percorso per includere l'eseguibile. |
-d -e -s <serial> |
Questi flag sono simili ai comandi adb con gli stessi nomi. Imposta questi flag se hai diversi dispositivi o emulatori connessi al computer host. I significati sono i seguenti:
In alternativa, puoi definire la variabile di ambiente |
--exec=<file> -x <file> |
Questa opzione indica a |
--nowait |
Disattiva la messa in pausa del codice Java fino alla connessione a GDB. Il superamento di questa opzione potrebbe causare il debugger per non saltare i punti di interruzione iniziali. |
--tui
-t |
Attiva l'interfaccia utente di testo, se disponibile. |
--gnumake-flag=<flag> |
Questa opzione consiste in una o più segnalazioni aggiuntive da passare
|
Nota: le ultime tre opzioni di questa tabella riguardano solo il
Versione Python di ndk-gdb
.
Supporto di Thread
Se la tua app viene eseguita su una piattaforma precedente ad Android 2.3 (livello API 9), ndk-gdb
non possono eseguire correttamente il debug dei thread nativi. Il debugger può eseguire il debug solo del thread principale, e anche completamente
ignora l'esecuzione di altri thread.
Se posizioni un punto di interruzione su una funzione eseguita su un thread non principale, il programma si chiude e GDB visualizza il seguente messaggio:
Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists.