ndk-gdb

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 script ndk-gdb non supporta l'utilizzo del metodo make APP=<name> precedente per la creazione.
  • Attiva il debug delle app nel file AndroidManifest.xml includendo un elemento Elemento <application> che imposta l'attributo android:debuggable su true.
  • 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.

Tabella 1. Opzioni comuni ndk-gdb e relative 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 ndk-gdb non sono sufficienti.

--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, ndk-gdb prova per impostazione predefinita a collegarsi a un'istanza esistente in esecuzione di l'app sul dispositivo di destinazione. Puoi ignorare questo comportamento predefinito utilizzando --start per avviare esplicitamente l'applicazione sul dispositivo di destinazione prima della sessione di debug.

--launch=<name>

Questa opzione è simile a --start, ma consente di avviare una query l'attività dalla tua applicazione. Questa funzionalità è utile solo se il file manifest definisce più lanciabili.

--launch-list

Questa opzione di praticità visualizza l'elenco di tutti i nomi di attività avviabili trovati nel tuo manifest dell'app. --start utilizza il nome della prima attività.

--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, ndk-gdb utilizza la porta TCP locale 5039 per comunicare con l'app è in corso il debug sul dispositivo di destinazione. Se usi una porta diversa puoi eseguire il debug in modo nativo dei programmi in esecuzione su diversi dispositivi o emulatori connessi allo stesso computer host.

--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:

    -d
    Connettiti a un singolo dispositivo fisico.
    -e
    Connettiti a un singolo emulatore.
    -s <serial>
    Connettiti a un emulatore o un dispositivo specifico. Qui, <serial> è il nome del dispositivo come indicato dal comando adb devices.

    In alternativa, puoi definire la variabile di ambiente ADB_SERIAL per elencare una specifica dispositivo, senza la necessità di un'opzione specifica.

  • --exec=<file>
  • -x <file>
  • Questa opzione indica a ndk-gdb di eseguire i comandi di inizializzazione GDB trovati in <file> dopo la connessione al processo che sta eseguendo il debug. Si tratta di una funzionalità utile se eseguire un'operazione più volte, ad esempio impostare un elenco di punti di interruzione e riprendere l'esecuzione automatica.

    --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 ndk-build sistema quando di eseguire query sulle informazioni del progetto. Puoi utilizzare più istanze di questa opzione lo stesso comando.

    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.