Questa pagina descrive in dettaglio l'utilizzo di LLDB per lo sviluppo del sistema operativo. Per lo sviluppo di app, vedi invece Eseguire il debug dell'app , che spiega come utilizzare la GUI di Android Studio (basata su LLDB).
GDB non è più supportato o fornito. Se stai passando da GDB a LLDB, probabilmente dovresti iniziare leggendo il tutorial LLDB . 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 consueto comando
envsetup.sh
. - Esegui lo stesso comando
lunch
che hai usato durante la costruzione. 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, riceverai un errore nel formato:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
- Collega il tuo dispositivo alla macchina.
Per ulteriore assistenza sulla configurazione dell'ambiente, consulta Configurazione dell'ambiente .
Debug di un binario
Per eseguire il debug di un binario creato sul tuo computer, dovrai prima copiare il binario sul dispositivo e quindi avviare il debugger. Per esempio:
adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe
Debug di app o processi in esecuzione
Per connetterti a un'app in esecuzione o a un demone nativo, utilizza lldbclient.py
con un PID. Ad esempio, per eseguire il debug del processo con PID 1234, esegui questo sull'host:
lldbclient.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 simboli e lo connette allo stub di debug remoto.
Debug dell'avvio del processo nativo
Per eseguire il debug di un processo all'avvio, utilizzare lldbclient.py
con l'opzione -r
. Ad esempio, per eseguire il debug ls /bin
, esegui questo comando sull'host:
lldbclient.py -r /system/bin/ls /bin
Quindi, inserisci continue
al prompt del debugger.
Debug dell'avvio dell'app
A volte è necessario eseguire il debug di un'app all'avvio, ad esempio quando si verifica un arresto anomalo e si desidera scorrere il codice per vedere cosa è successo prima dell'arresto anomalo. In alcuni casi l'allegato funziona, ma in altri casi è impossibile perché l'app si blocca prima che tu possa allegare. L'approccio logwrapper
(utilizzato per strace
) non funziona sempre perché l'app potrebbe non avere le autorizzazioni per aprire una porta e lldbserver
eredita tale restrizione.
Per eseguire il debug dell'avvio dell'app, utilizza le opzioni sviluppatore in Impostazioni per indicare all'app di attendere il collegamento di un debugger Java:
- Vai su Impostazioni > Opzioni sviluppatore > Seleziona app di debug e scegli la tua app dall'elenco, quindi fai clic su Attendi il 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 i punti di interruzione, quindi continua il processo.
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
Debug di app o processi che si bloccano
Se vuoi che debuggerd
sospenda i processi bloccati 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
Alla fine del consueto output dell'arresto anomalo, debuggerd
fornisce istruzioni di copia e incolla in logcat che mostrano come connettere il debugger al processo arrestato in modo anomalo.
Debug con VS Code
LLDB supporta il debug del codice della piattaforma su Visual Studio Code . Puoi utilizzare il frontend del debugger VS Code invece dell'interfaccia CLI 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 tutti gli artefatti di compilazione (come i simboli) richiesti per eseguire
lldbclient.py
olldbclient.py
siano presenti. - In VS Code premere Ctrl+Shift+P per eseguire un comando, cercare Debug: Add Configuration... , quindi selezionare LLDB . Questo apre un file
launch.json
e aggiunge 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 di configurazione assomigli a questo:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
lldbclient.py
utilizza questi commenti per rilevare dove scrivere la configurazione. Se nell'elenco sono presenti altri elementi, aggiungere le righe di commento alla fine dopo le altre configurazioni. - Esegui il comando seguente 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. Questo è previsto; non uccidere 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 flag se è presente a causa del modo in cui i flag vengono analizzati dallo strumento. - Apri la barra laterale Esegui e debug : la nuova configurazione dovrebbe apparire nell'elenco dei debugger. Premere Avvia debug (F5) . Il debugger dovrebbe connettersi dopo 10-30 secondi.
Se la nuova configurazione non viene visualizzata nella vista Esegui e debug, ricarica la finestra per aggiornare l'elenco dei debugger: premi Ctrl+Shift+P e digita
reload window
. - Una volta terminato il debug, vai al terminale che esegue
lldbclient.py
e premi Invio per terminare il programmalldbclient.py
. Le successive esecuzioni dello script genererebbero la configurazione tra i commenti#lldbclient-generated
e sostituirebbero i vecchi contenuti, 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"}' \
...
Le proprietà di esempio farebbero sì che VS Code esegua un'attività denominata Build
prima del debug e aggiunga un nuovo passaggio di inizializzazione del debug ai passaggi generati dallo script. È possibile trovare una panoramica delle proprietà disponibili nella documentazione di VS Code e nel Manuale utente dell'estensione CodeLLDB .