Questa pagina illustra l'utilizzo di LLDB per lo sviluppo del sistema operativo. Per lo sviluppo di app, consulta invece la sezione Eseguire il debug dell'app, che spiega come utilizzare la GUI di Android Studio (basata su LLDB).
GDB non è più supportato o fornito. Se passi da GDB a LLDB, ti consigliamo di iniziare leggendo il tutorial su LLDB. Se sei un utente esperto di GDB, 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
utilizzato durante la compilazione. Tieni presente che l'elemento del pranzo deve corrispondere esattamente al dispositivo di cui stai eseguendo il debug. Se l'elemento del pranzo non corrisponde al dispositivo collegato, viene visualizzato un errore del seguente tipo:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
- Collega il dispositivo alla macchina.
Per ulteriore assistenza sulla configurazione dell'ambiente, consulta Configurare l'ambiente.
Eseguire il debug di un file binario
Per eseguire il debug di un file binario compilato sulla tua macchina, devi prima copiarlo sul dispositivo e poi avviare il debugger. Ad esempio:
adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe
Esegui il debug di app o processi in esecuzione
Per connetterti a un'app o a un demone nativo in esecuzione, utilizza
lldbclient.py
con un PID. Ad esempio, per eseguire il debug del processo con PID
1234, esegui questo comando sull'host:
lldbclient.py -p 1234
Lo script configura 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 connette allo stub di debug remoto.
Debug dell'avvio del processo nativo
Per eseguire il debug di un processo all'avvio, utilizza lldbclient.py
con l'opzione -r
. Ad esempio, per eseguire il debug di ls /bin
, esegui questo comando sull'host:
lldbclient.py -r /system/bin/ls /bin
Poi, inserisci continue
al prompt del debugger.
Eseguire il debug dell'avvio dell'app
A volte vuoi eseguire il debug di un'app all'avvio, ad esempio quando si verifica un arresto anomalo e vuoi eseguire la procedura passo passo del codice per vedere cosa è successo prima dell'arresto anomalo.
L'aggancio funziona in alcuni casi, ma in altri è impossibile perché l'app si arresta in modo anomalo prima che tu possa agganciarti. L'approccio logwrapper
(utilizzato per strace
) non funziona sempre perché l'app potrebbe non disporre delle autorizzazioni per aprire una porta e lldbserver
eredita questa limitazione.
Per eseguire il debug dell'avvio dell'app, utilizza le Opzioni sviluppatore in Impostazioni per indicare all'app di attendere l'attacco di un debugger Java:
- Vai a Impostazioni > Opzioni sviluppatore > Seleziona app di debug e scegli la tua app dall'elenco, quindi fai clic su Attendi debugger.
- 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
- Attendi il caricamento dell'app e la visualizzazione di una finestra di dialogo che ti informa che l'app è in attesa di un debugger.
- Collega
lldbserver
/lldbclient
normalmente, imposta breakpoint e poi continua la procedura.
Per consentire l'esecuzione dell'app, collega 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
Eseguire il debug di app o processi che si arrestano in modo anomalo
Se vuoi che debuggerd
sospenda i processi in crash in modo da poter collegare un debugger, imposta la proprietà appropriata:
- Dopo Android 11
adb shell setprop debug.debuggerd.wait_for_debugger true
- Android 11 e versioni precedenti
adb shell setprop debug.debuggerd.wait_for_gdb true
- Android 6.0 Marshmallow e versioni precedenti
adb shell setprop debug.db.uid 999999
Al termine dell'output abituale dell'arresto anomalo, debuggerd
fornisce istruzioni di copia e incolla in logcat che mostrano come collegare il debugger al processo in cui si è verificato l'arresto anomalo.
Eseguire il debug con VS Code
LLDB supporta il debug del codice della piattaforma su Visual Studio Code. Puoi utilizzare il frontend del debugger di VS Code anziché l'interfaccia a riga di comando LLDB per controllare ed eseguire il debug del codice nativo in esecuzione sui dispositivi.
Prima di utilizzare VS Code per il debug, installa l' estensione CodeLLDB.
Per eseguire il debug del codice utilizzando VS Code:
- Assicurati che siano presenti tutti gli elementi di compilazione (ad esempio i simboli) necessari per eseguire
lldbclient.py
olldbclient.py
. - In VS Code, premi Ctrl+Maiusc+P per eseguire un comando, cerca Debug:
Aggiungi configurazione e seleziona LLDB.
Si apre un file
launch.json
e viene aggiunto un nuovo oggetto JSON a un elenco. - Sostituisci la configurazione del debugger appena aggiunta con due righe di commento,
// #lldbclient-generated-begin
e// #lldbclient-generated-end
, in modo che l'elenco delle configurazioni sia simile al seguente:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
utilizza questi commenti per rilevare dove scrivere la configurazione. Se esistono altri elementi nell'elenco, aggiungi le righe di commento alla fine dopo le altre configurazioni. - Esegui il seguente comando nel terminale in cui hai eseguito
envsetup.sh
elunch
:lldbclient.py --setup-forwarding vscode-lldb \ --vscode-launch-file LAUNCH_JSON_PATH \ ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
lldbclient.py
scrive la configurazione generata inlaunch.json
e continua a funzionare. Si tratta di un comportamento previsto. Non arrestare il programmalldbclient.py
. Se ometti--vscode-launch-file
, lo script stamperà lo snippet JSON che dovrai copiare e incollare manualmente inlaunch.json
.Il flag
-r
deve essere l'ultimo se è presente a causa del modo in cui i flag vengono analizzati dallo strumento. - Apri la barra laterale Esegui e esegui il debug. La nuova configurazione dovrebbe apparire nell'elenco del debugger. Premi Avvia debug (F5). Il debugger dovrebbe connettersi dopo
10-30 secondi.
Se la nuova configurazione non è visualizzata nella visualizzazione Esegui e debug, ricarica la finestra per aggiornare l'elenco del debugger: premi Ctrl+Maiusc+P e digita
reload window
. - Al termine del debug, vai al terminale in cui è in esecuzione
lldbclient.py
e premi Invio per terminare il programmalldbclient.py
. Le esecuzioni successive dello script genereranno la configurazione tra i commenti#lldbclient-generated
e sostituiranno i vecchi contenuti, quindi non è necessario rimuoverli manualmente.
Per aggiungere proprietà personalizzate alla configurazione di lancio generata, puoi utilizzare il
flag --vscode-launch-props
. Ad esempio:
lldbclient.py --setup-forwarding vscode-lldb \
--vscode-launch-props \
'{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
...
Build
prima del debug e aggiunga un nuovo passaggio di inizializzazione del debug ai passaggi generati dallo script. Puoi trovare una panoramica delle proprietà disponibili nella
documentazione di VS Code e nel manuale dell'utente dell'
estensione CodeLLDB.