2010-10-12 3 views
9

Sto avendo problemi con l'utilizzo di un debugger Java java con app Android su emulatore. Apparentemente, qualsiasi debugger java con funzionalità remote come jdb (o jswat) potrebbe essere sfruttato, seguendo i passaggi seguenti (come ho capito dopo aver letto qua e là):debug dell'applicazione Android con "jdb -attach" (o jswat)

1) accendi l'emulatore, installa la tua app su l'emulatore (adb install)

2) Accendere il server Dalvik (DDMS)

3) sul emulatore, eseguire il "DevTools" app -> "Impostazioni di sviluppo" -> selezionare l'applicazione che vuoi eseguire il debug, abilita il flag "Attendi il debugger"

4) ancora nell'emulatore, avvia la tua app; bloccherà, in attesa di un debugger da allegare, e dalvik mostrerà un nuovo processo contrassegnato da un "bug rosso"

5) su dalvik, selezionare il processo contrassegnato in rosso; la sua porta di debug viene quindi inoltrata a localhost: 8700

6) collegare il debugger a localhost: 8700. Con jdb devi eseguire "jdb -attach 8700"

Non appena il debugger viene avviato, la tua app sull'emulatore si sblocca. Quindi, sembra che l'app abbia rilevato correttamente un debugger e quindi sia libero.

Il punto, tuttavia, è che "viene eseguito gratuitamente", ovvero non attenderà che il debugger esegua un comando "Esegui". Quindi non ho alcuna possibilità di impostare alcun punto di interruzione.

Seguendo i suggerimenti da 1, ho provato a mettere i cicli di attesa all'inizio della mia app, nella speranza che avrei il tempo di impostare un punto di interruzione. Quando provo a impostare un breakpoint, jdb dice "Deferring breakpoint XXX.YYY. Sarà impostato dopo che la classe è stata caricata.", Poiché l'app non era ancora in esecuzione. Ma, se poi invio un comando "run", la risposta è "Nothing suspended.", Poiché l'app era già in esecuzione (ed è proprio così).

Con JSwat non si vede al questi messaggi, ma il risultato finale è lo stesso :-(

Inutile dire, "jdb -attach" funziona bene con le applicazioni Java non-Android in esecuzione su localhost.

Eventuali suggerimenti (ad eccezione di "utilizzare Eclipse")?

sono io manca solo uno stupido dettaglio da qualche parte?

L'applicazione è un HelloWorld, il comando build è "debug formica".

0.123.516,41 mila

Grazie in anticipo.

+0

Compatibile con dispositivi fisici e virtuali: https://asantoso.wordpress.com/2009/09/26/using-jdb-with-adb-to-debugging-of-android-app-on-a-real -dispositivo/ –

risposta

4

Il modo migliore sembra essere quello di impostare il punto di interruzione nel file .jdbrc, poiché questi sono caricati e rimandati e non è necessario modificare il codice per impostare cicli di ritardo arbitrari che cercano di catturare il debugger mentre è in attesa. Io, come te, ho scoperto che non funziona se imposti i breakpoint su un nome di classe. Dice il posticipo fino al caricamento della classe, ma sembra che jdb non venga mai informato quando la classe viene caricata.

Tuttavia funziona se si imposta un punto di interruzione in un di classe e la linea specifica il numero

nel vostro.jdbrc file:

 
stop in com.android.helloandroid.HelloAndroid 
stop at com.android.helloandroid.HelloAndroid:21 

La prima riga non fa nulla, come già sapete. La seconda linea funziona per me qui:

 
Initializing jdb ... 
*** Reading commands from /home/codeboy2k/.jdbrc 
Deferring breakpoint com.android.helloandroid.HelloAndroid. 
It will be set after the class is loaded. 
> Deferring breakpoint com.android.helloandroid.HelloAndroid:21. 
It will be set after the class is loaded. 
> > Set deferred breakpoint com.android.helloandroid.HelloAndroid:21 

Breakpoint hit: "thread= main", com.android.helloandroid.HelloAndroid.onCreate(), line=21 bci=11 

main[1] 

Quindi la chiave sembra essere quella di utilizzare numeri di linea specifici nei punti di interruzione. Provaci. Spero che ti aiuti e lavori anche per te.

0

Sì, funziona :-) Grazie mille, codeboy2k!

Ho anche fatto più esperimenti, e sembra che funzioni anche se si specifica un nome di metodo (ad esempio "stop in com.android.helloandroid.HelloAndroid.onCreate"). Il trucco chiave, quindi, consiste nel mettere un breakpoint iniziale nel file di avvio di jdb, quindi l'app deve bloccare in quel punto di interruzione e quindi continuare con la sessione di debug corrente.

Ho anche provato con jswat e la procedura corretta è la seguente: caricare il codice sorgente, impostare i punti di interruzione (almeno quello iniziale), quindi collegare il debugger all'app (che nel frattempo stava aspettando il debugger). Da quel momento in poi, l'app passerà da un punto di interruzione all'altro. È un peccato, tuttavia, che jswat non mostri questo progresso sul codice sorgente stesso :-(

0

Cerca anche l'opzione suspend = y JDWP sulla riga di comando quando lanci dalvik ... Nota: Ho non provato, dalvik ha la capacità di sospendere il caricamento con le corrette opzioni della riga di comando

0

Una cosa che ho notato sulla mia configurazione di non eclissi è che se ho ancora l'ADV in esecuzione posso ottenere la sessione di debug per attach (porta 8700) ma non riesco a colpire i punti di interruzione ... chiudi l'ADV e funziona Non ho idea del perché ma questo funziona per me

Here è il mio setup in caso sia d'aiuto. m ora sulla versione 17 ma su altri piuttosto che è la stessa configurazione.