Usare lo strumento Dalvik Debug Monitor Service (DDMS)
Android gira con uno strumento di debugging chiamato Dalvik Debug Monitor Service (DDMS), che fornisce servizi port-forwarding, catture di schermate del dispositivo, visualizzare diversi tipi di informazioni sul dispositivo, informazione sullo stato di logcat, processo, e radio, e altre funzioni. DDMS gira nella directory tools/ del SDK; per eseguire DDMS, digita semplicemente ddms (in lettere minuscole) in una finestra terminale (shell window) in quella directory. DDMS lavorerà sia con l'emulatore che con il dispositivo; se entrambi sono connessi e in esecuzione simultaneamente, il DDMS lavora di default con l'emulatore. Questa pagina offre una breve lista delle caratteristiche del DDMS; ma non costituisce un'esplorazione esaustiva di tutte le sue funzioni e potenzialità.
Puoi impostare una serie di referenze DDMS in File->Preferences. Le preferenze sono salvate in "$HOME/.ddmsrc".
Pannello in basso a sinistra
La parte sinistra dello schermo mostra una lista di tutte le virtual machines sul dispositivo/emulatore che il DDMS trova. Le VMs sono definite dal nome del pacchetto dell'applicazione che ospita; se hai diverse activities in un singolo pacchetto, staranno tutte nella stessa stessa VM. Usa questa lista per trovare e collegare alla VM in esecuzione la/le activity/ies sulle quali vuoi eseguire il debug. Vicino a ogni VM nella lista si trovano uno o due "debugger pass-through" port numbers (numeri di porta); se vuoi connettere il tuo debugger ad uno delle porte elencate, sarai connesso alla VM corrispondente sul dispositivo. Un'utile funzione è che Dalvik assegna una porta addizionale, 8700, per la VM correntemente selezionata nella lista. Questa porta di default "correntemente selezionata" ti permette di cambiare applicazione senza dover riconfigurare la porta del tuo debugger ogni volta. Quando un'applicazione in esecuzione in una VM Dalvik richiama waitForDebugger() (o selezioni questa opzione nelle opzioni di sviluppo), un'icona rossa comparirà a fianco del nome del client. Quando viene connesso un debugger, l'icona diventerà verde.
DDMS ha alcuni tabs che mostrano utili informazioni sulla VM correntemente selezionata:
Tab Info
Fornisce alcune informazioni generali sulla VM selezionata, inclusi l'ID del processo, e la porta del dispositivo a cui si connette il DDMS. Questa non è la porta che configurerai perché venga usato dal tuo IDE.
Oltre alla porta elencata, la VM correntemente selezionata dalla lista in basso a sinistra è anche inoltrata alla porta 8700. Avere questa porta "correntemente selezionata" ti evita di dover riconfigurare Eclipse quando esegui il debug di Activities multiple. (Questo numero di porta "correntemente selezionato" è configurabile dal pannello delle preferenze.)
Tab Threads
Il tab threads ha una lista di threads in esecuzione nel processo della VM obiettivo. Per ridurre la quantità di dati inviati attraverso il cavo, gli aggiornamenti del thread vengono inviati solo quando esplicitamente attivati selezionando il pulsante"threads" nella barra degli strumenti. La selezione è mantenuta per la VM. Questo tab contiene le seguenti informazioni:
- ID - un VM-assigned thread ID unico. In Dalvik, si tratta di numeri dispari partendo da 3.
- Tid - il thread ID di Linux. Per il thread principale in un processo, si accorderà con l'ID del processo.
- Status - lo stato del thread della VM. I daemon threads vengono mostrati con un '*'. Questi sono gli stati possibili:
- running - codice di applicazione in esecuzione
- sleeping - chiamato Thread.sleep()
- monitor - in attesa di acquisire un monitor lock
- wait - in Object.wait()
- native - codice nativo in esecuzione
- vmwait - in attesa di una risorsa della VM
- zombie - thread è sul punto di terminare
- init - thread sta per inizializzarsi (non dovrebbe comparire)
- starting - thread si sta per avviare (anche questo non dovrebbe comparire)
- utime - tempo cumulativo usato per eseguire codice utente, in "jiffies" (normalmente 10ms). Disponibile solo con Linux.
- stime - tempo cumulativo usato per eseguire codice di sistema, in "jiffies" (normalmente 10ms).
- Name - il nome del thread
"ID" e "Name" vengono impostati quando il thread viene avviato. I campi rimanenti vengono aggiornati periodicamente (di default ogni 4 secondi).
Tab Heap
Mostra alcuni heap stats, aggiornati durante la collezione degli elementi da eliminare.
Port Forwarding (collegare un debugger al dispositivo)
DDMS agisce come intermediario per connettere l'IDE alle applicazioni in esecuzione sul dispositivo. Android ospita processi multipli, ognuno dei quali ospita la propria virtual machine. Ogni applicazione esegue il suo proprio processo. Ogni processo si riferisce a un debugger in una porta differente: la prima porta si riferisce a un debugger sulla porta 8000, il seguente su 8001, e così via. DDMS fa la scansione delle porte 8000-8019 sul dispositivo di default e la riesegue per nuovi processi ogni 2 secondi (puoi cambiare queste impostazioni nella pagina delle preferenze di DDMS). Quando il DDMS individua una virtual machine, la connette con la porta del debugger e inizia a richiedere informazioni. DDMS interagisce con la VM Dalvik usando un protocollo di filo (wire protocol) personalizzato. Dopo essersi connesso, inizia a inoltrare queste informazioni alla porta specificata che puo essere collegato al desktop IDE, come descritto in Configurare il tuo IDE per collegarlo alla porta 8700 per il debugging.
Problemi relativi al debugging con Dalvik
Fare il debug di un'applicazione nella VM Dalvik dovrebbe funzionare nello stesso modo rispetto ad altre VMs. Ma c'è un'eccezione importante da segnalare:
- Quando si esce riga per riga dal codice sincronizzato, il cursore della "linea corrente" potrebbe saltare all'ultima linea nel metodo in un colpo solo.
Cattura di schermate
Puoi catturare immagini delle schermate del dispositivo o dell'emulatore selezionando Device > Screen capture... dal menù principale.
Esplorazione dei processi
Puoi vedere l'output di ps -x per una VM specifica selezionando Device > Show process status... dal menù principale.
Causare una GC
Per causare una GC (garbage collection) basta premere il pulsante GC sulla barra degli strumenti.
Eseguire Dumpsys e Dumpstate sul dispositivo (logcat)
- Per eseguire dumpsys (logcat) da Dalvik, seleziona Device > Run logcat... dal menù principale.
- Per eseguire dumpstate da Dalvik, seleziona Device > Dump device state... dal menù principale.
Esaminare lo stato radio
Di default, lo stato radio non risulta durante un logcat standard (si tratta di un gran numero di informazioni). Per vedere informazioni radio, puoi premere su Device > Dump radio state... o eseguire logcat come descritto in Registrare Radio Data.
Fermare una virtual machine
Puoi fermare una virtual machine selezionando Actions > Halt VM. Premendo questo pulsante la VM richiamerà System.exit(1).
Problemi con il DDMS
Le limitazioni conosciute del DDMS hsono le seguenti:
- Se connetti e disconnetti un debugger, ddms abbandona e riconnette il client in modo che la VM realizzi che il debugger non c'è più. Questo problema verrà risolto.
- Non tentare di connettere ddms a un'applicazione in esecuzione in una Sun Java desktop VM. Si bloccherà.