Utilizzo dei debugger

Questa pagina descrive in dettaglio l'utilizzo di LLDB o GDB per lo sviluppo del sistema operativo. Per lo sviluppo di app, vedere invece eseguire il debug dell'app , che spiega come usare la GUI di Android Studio (basata su LLDB).

GDB è obsoleto e verrà rimosso a breve. Se stai passando da GDB a LLDB, dovresti probabilmente iniziare leggendo il LLDB Tutorial . Se sei un utente GDB esperto, la mappa dei comandi da GDB a LLDB è molto utile durante la transizione.

Prerequisiti

Per utilizzare un debugger:

  • Configura l'ambiente di compilazione con il solito comando envsetup.sh .
  • Esegui lo stesso comando lunch che hai usato durante la costruzione.

Per ulteriore assistenza sulla configurazione dell'ambiente, consulta Configurazione dell'ambiente .

Debug di app o processi in esecuzione

Per connetterti a un'app in esecuzione oa un demone nativo, usa gdbclient.py con un PID. Ad esempio, per eseguire il debug del processo con PID 1234, esegui questo sull'host:

gdbclient.py -p 1234

Lo script imposta il port forwarding, avvia lo stub di debug remoto appropriato sul dispositivo, avvia il debugger sull'host, lo configura per trovare i simboli e lo collega allo stub di debug remoto.

Debug dell'avvio del processo nativo

Per eseguire il debug di un processo all'avvio, utilizzare gdbclient.py con l'opzione -r . Ad esempio, per eseguire il debug ls /bin , esegui questo sull'host:

gdbclient.py -r /system/bin/ls /bin

Quindi, immetti continue al prompt del debugger.

Avvio dell'app di debug

A volte vuoi eseguire il debug di un'app all'avvio, ad esempio quando si verifica un arresto anomalo e vuoi scorrere il codice per vedere cosa è successo prima dell'arresto anomalo. L' allegato funziona in alcuni casi, ma in altri casi è impossibile perché l'app si arresta in modo anomalo prima che tu possa allegare. L'approccio logwrapper (usato per strace ) non funziona sempre perché l'app potrebbe non disporre delle autorizzazioni per aprire una porta e gdbserver eredita tale restrizione.

Per eseguire il debug dell'avvio dell'app, utilizza le opzioni sviluppatore in Impostazioni per indicare all'app di attendere che un debugger Java si colleghi:

  1. Vai su Impostazioni > Opzioni sviluppatore > Seleziona app di debug e scegli la tua app dall'elenco, quindi fai clic su Attendi debugger .
  2. Avvia l'app, dal programma di avvio o utilizzando la riga di comando per eseguire:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Attendi il caricamento dell'app e la visualizzazione di una finestra di dialogo che ti informa che l'app è in attesa di un debugger.
  4. Collega gdbserver / gdbclient normalmente, imposta i punti di interruzione, quindi continua il processo.

Per consentire l'esecuzione dell'app, allega un debugger Java Debug Wire Protocol (JDWP) come Java Debugger (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

Debug di app o processi che si arrestano in modo anomalo

Se vuoi che debuggerd sospenda i processi in crash in modo da poter allegare un debugger, imposta la proprietà appropriata:

  • Dopo Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 e
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow e
    adb shell setprop debug.db.uid 999999
    
    inferiore7

Alla fine del normale output di arresto anomalo, debuggerd fornisce istruzioni di copia e incolla in logcat che mostrano come connettere il debugger al processo bloccato.

Debug senza simboli

Per ARM a 32 bit, se non hai simboli, gdb non può determinare quale set di istruzioni sta disassemblando (ARM o Thumb). Per specificare il set di istruzioni scelto come predefinito quando mancano le informazioni sui simboli, impostare la seguente proprietà:

set arm fallback-mode arm  # or thumb

Debug con VS Code

LLDB supporta il debug del codice della piattaforma su Visual Studio Code . È possibile utilizzare il front-end del debugger VS Code invece dell'interfaccia della CLI LLDB per controllare ed eseguire il debug del codice nativo in esecuzione sui dispositivi.

Prima di utilizzare VS Code per il debug, installare l' estensione CodeLLDB .

Per eseguire il debug del codice utilizzando VS Code:

  1. Assicurati che tutti gli artefatti di compilazione (come i simboli) necessari per eseguire gdbclient.py o lldbclient.py siano presenti.
  2. Eseguire il comando seguente:
    lldbclient.py --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    Questo stampa un oggetto JSON e lldbclient.py continua a funzionare. Questo è previsto; non uccidere il programma lldbclient.py .

    Il flag -r deve essere l'ultimo flag se è presente a causa del modo in cui i flag vengono analizzati dallo strumento.

  3. Nella scheda debug in VS Code, seleziona aggiungi configurazione , quindi seleziona LLDB: Custom Launch . Questo apre un file launch.json e aggiunge un nuovo oggetto JSON a un elenco.
  4. Elimina la configurazione del debugger appena aggiunta.
  5. Copia l'oggetto JSON stampato da lldbclient.py e incollalo nell'oggetto che hai appena eliminato. Salva le modifiche.
  6. Per ricaricare la finestra per aggiornare l'elenco dei debugger, premere Ctrl+Maiusc+P e digitare reload window .
  7. Seleziona la nuova configurazione del debugger e premi Esegui . Il debugger dovrebbe connettersi dopo 10-30 secondi.
  8. Al termine del debug, vai al terminale che esegue lldbclient.py e premi Invio per terminare il programma lldbclient.py .