Utilizzare i debugger

I dettagli di questa pagina utilizzando LLDB per lo sviluppo del sistema operativo. Per lo sviluppo di app, vedi 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, dovresti probabilmente inizia leggendo le Tutorial LLDB. Se sei un utente esperto di GDB, Mappa dei comandi da GDB a LLDB è molto utile durante la transizione.

Prerequisiti

Per utilizzare un debugger:

  • Configura l'ambiente di build con il solito comando envsetup.sh.
  • Esegui lo stesso comando lunch che hai utilizzato durante la creazione. Tieni presente che l'elemento per il pranzo deve corrispondere esattamente al dispositivo di cui si esegue il debug. Se l'articolo per il pranzo non corrisponde al dispositivo collegato, verrà visualizzato un errore nel modulo: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Connetti il dispositivo alla macchina.

Per ulteriore assistenza sulla configurazione dell'ambiente, consulta Configura l'ambiente.

Debug di un file binario

Per eseguire il debug di un programma binario che hai creato sulla tua macchina, devi prima copiarlo sul dispositivo e quindi avviare il debugger. Ad 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 daemon nativo, usa 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 la sequenza stub di debug remoto sul dispositivo, avvia il debugger l'host, lo configura per la ricerca di simboli e connette allo stub di debug remoto.

Avvio del processo nativo del debug

Per eseguire il debug di un processo all'avvio, utilizza lldbclient.py con -r . Ad esempio, per eseguire il debug di ls /bin, esegui questo comando sull'host:

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

Quindi, inserisci continue quando richiesto del debugger.

Esegui il debug dell'avvio dell'app

A volte potresti voler eseguire il debug di un'app all'avvio, ad esempio in caso di arresto anomalo e vuoi analizzare il codice per vedere cosa è successo prima dell'arresto anomalo. In alcuni casi funziona l'opzione Allegare, ma in altri casi lo è. impossibile perché l'app ha un arresto anomalo prima di poter eseguire l'allegato. La Approccio logwrapper (utilizzato per strace) non funziona sempre perché l'app potrebbe non avere autorizzazioni per aprire una porta e lldbserver la eredita delle risorse.

Per eseguire il debug dell'avvio dell'app, usa le Opzioni sviluppatore in Impostazioni per indicare l'app deve attendere il collegamento di un debugger Java:

  1. Vai a Impostazioni > Opzioni sviluppatore > Seleziona App di debug e scegli l'app dall'elenco, poi fai clic su Attendi debugger.
  2. Avvia l'app da Avvio app 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 viene visualizzata una finestra di dialogo che indica che l'app è in attesa del debugger.
  4. Allega lldbserver/lldbclient normalmente, imposta punti di interruzione, quindi continua la procedura.

Per consentire l'esecuzione dell'app, collega un protocollo JDWP (Java Debug Wire Protocol) come debugger Java (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 sospendi i processi che hanno subito un arresto anomalo in modo da collega 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 normale output di arresto anomalo, debuggerd fornisce la funzione di copia e incolla istruzioni in logcat che mostrano come connettere il debugger al processo che si è arrestato in modo anomalo.

Debug con VS Code

LLDB supporta il debug del codice della piattaforma su Codice di Visual Studio. Puoi utilizzare il frontend del debugger di VS Code anziché l'interfaccia dell'interfaccia a riga di comando LLDB per controllare e eseguire il debug del codice nativo in esecuzione sui dispositivi.

Prima di utilizzare VS Code per il debug, installa il Estensione CodeLLDB.

Per eseguire il debug del codice utilizzando VS Code:

  1. Assicurati che tutti gli artefatti della build (come i simboli) siano necessari per l'esecuzione lldbclient.py o lldbclient.py sono presenti.
  2. In VS Code, premi Ctrl+Maiusc+P per eseguire un comando, cerca Debug: Aggiungi configurazione..., quindi seleziona LLDB. Viene aperto un file launch.json e viene aggiunto un nuovo oggetto JSON a un elenco.
  3. Sostituisci la configurazione del debugger appena aggiunta con due righe di commento: // #lldbclient-generated-begin e // #lldbclient-generated-end, quindi che l'elenco di configurazioni ha il seguente aspetto:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py utilizza questi commenti per rilevare dove scrivere la configurazione. Se ci sono sono altri elementi dell'elenco, aggiungi le righe di commento alla fine, dopo le altre configurazioni.

  4. Esegui questo comando nel terminale in cui hai eseguito envsetup.sh e lunch:
    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 in launch.json e continua a essere eseguito. Si tratta di un comportamento previsto. non terminare il programma lldbclient.py. Se ometti --vscode-launch-file, lo script stamperà lo snippet JSON che dovrai devi copiare e incollare manualmente in launch.json.

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

  5. Apri la barra laterale Esegui e debug. La nuova configurazione dovrebbe essere visualizzata nella dell'elenco debugger. Premi Avvia debug (F5). Il debugger dovrebbe connettersi dopo da 10 a 30 secondi.

    Se la nuova configurazione non compare nella vista Esegui e debug, ricarica la finestra per aggiorna l'elenco del debugger: premi Ctrl+Maiusc+P e digita reload window.

  6. Al termine del debug, vai al terminale in esecuzione lldbclient.py e premi Invio per terminare lldbclient.py. Esecuzioni successive dello script genererebbero la configurazione tra i commenti #lldbclient-generated e sostituire i contenuti precedenti, non manualmente.

Per aggiungere proprietà personalizzate alla configurazione di avvio generata, puoi utilizzare --vscode-launch-props flag. Ad esempio:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Con le proprietà di esempio VS Code eseguirebbe un'attività denominata Build prima del debug e aggiunge un nuovo passaggio di inizializzazione del debug ai passaggi generati dallo script. Puoi trovare delle strutture disponibili nella documentazione di VS Code e nel Manuale dell'utente del . Estensione CodeLLDB.