2011-02-03 16 views
15

Certo, la mia domanda è fondamentalmente lo stesso come questo, ma sembra essere stato lasciato senza risposta:Eclipse Android Debugger - Dove nel mio codice ho causato l'eccezione?

NullPointerException in handleStopActivity -- No reference to my code in stack trace

scaricato Eclipse Helios, strumenti di sviluppo Android Plugin, e il JDK tutto entro l'ultima settimana. Stavo scherzando con un'app sul mio dispositivo, l'ho eseguita in modalità debug e si è conclusa in modo imprevisto. Mi sono reso conto che avevo causato una NullPointerException e il problema in sé non era un problema per molto tempo.

Ciò che è un problema, tuttavia, è che il debugger non sembra in grado di identificare dove nel mio codice è stata generata l'eccezione. La traccia dello stack non fa riferimento al mio codice.

Anzi, se metto il seguente nel metodo OnCreate(), ottengo lo stesso problema

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //lI("onCreate()"); //A silly logging thing I messed around with 

    Integer iDareYou = null; 
    iDareYou.byteValue(); 

Molto al suo attivo, Eclipse mi avverte di certo che il codice è probabile che esplodere in faccia. Ma quando ho eseguito questo sul mio dispositivo, l'analisi dello stack restituito è il seguente:

Thread [<1> main] (Suspended (exception RuntimeException)) 
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2787 
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2803 
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 135 
ActivityThread$H.handleMessage(Message) line: 2136 
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 144 
ActivityThread.main(String[]) line: 4937  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 521 
ZygoteInit$MethodAndArgsCaller.run() line: 868 
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method] 

Ho cercato in giro per alcune risposte e, purtroppo, tutto quello che potevo venire con erano domande del 'Perché il mio app Android causando una NullPointerException '? varietà.

Spero di scoprire cosa dovrei fare in modo diverso per essere in grado di trovare il punto nel mio codice in cui ho causato l'eccezione .... perché sono sicuro che questa capacità sarebbe utile a qualche punto in futuro!


Passare alla modifica per aggiungere alcune informazioni. Come cita il primo commento qui sotto, lo stato in cui il debugger sospende il thread non è lo stato 'finale' dell'applicazione. Premendo 'resume' un paio di volte si sposta il processo lungo il punto in cui il processo termina effettivamente, anche se sfortunatamente nessuna traccia di stack utile viene visualizzata nella finestra Debug di Eclipse/ADT. Tuttavia,, a questo punto la traccia dello stack ho incollato sopra seguito da le prime 3 linee univoche dello stack trace dell'NPE nel mio codice vengono emesse in LogCat. In precedenza avevo cercato di vedere se LogCat aveva qualcosa che potevo usare, ma molto probabilmente lo era prima che avessi premuto 'resume' nel debugger per spostare il processo in questo stato. Sfortunatamente, tuttavia, facendo in questo modo non viene mai visualizzata una traccia dello stack dell'NPE nel mio codice nel debugger effettivo.

Ma la notizia non è affatto male - dalle informazioni nella finestra 'Variabili' a destra, posso vedere che c'è un NPE nel campo di applicazione corrente del thread, in modo che almeno mi desse un indizio che un NPE sta succedendo (e ovviamente c'è LogCat).

Quindi, in base a un suggerimento su un argomento diverso, il miglior lavoro che ho trovato è quello di aggiungere un breakpoint "Caught and Uncaught" per NullPointerException. Quando eseguo questa operazione e rilancio, il debugger visualizza la traccia dello stack dell'NPE nel mio codice e sposta la finestra di modifica direttamente sulla riga in cui ho causato l'NPE.

Al momento credo che ciò sia dovuto al fatto che l'NPE viene catturato (e presumibilmente, nuovamente gettato) dal framework Android. Sembra che il dilemma originale sia stato causato dal fatto che la finestra Eclipse/ADT/DalvikVM Debug Stack Trace non include l'informazione "causata da" (per quanto posso dire) che viene visualizzata nella traccia stack "in seguito" visualizzata in LogCat.Analizzerò ulteriormente se questo possa essere risolto :)

Apprezzo il suggerimento di Bert F, poiché non ero pienamente consapevole del fatto che il thread non era ancora nel suo stato 'finale'. Anche se è vero che la traccia dello stack è [più tardi] visualizzata in LogCat, non l'ho "perso" in LogCat perché non era ancora [ancora] lì, quello che mi è mancato è stato il "resume" che avrebbe causato la traccia dello stack essere emesso in LogCat.

Anche se avevo preso il debugger di fermarsi alla linea nel mio codice utilizzando un punto di interruzione, c'è un caso per il fatto che ho potuto infine ottenuto l'analisi dello stack in LogCat dopo la ripresa del filo, che avrebbe in modo efficace problema risolto. L'unica altra cosa che potrei davvero chiedere sarebbe di avere il debugger fermo sulla linea nel mio codice che causa l'eccezione, invece di essere catturato e successivamente ri-gettato dal framework Android. Ma credo che sarebbe una domanda diversa :) E Eclipse, essendo utile così com'è, mi manderà lì se clicco sulla riga appropriata nella traccia dello stack visualizzata nella finestra LogCat.

+2

Sembra che il programma sia stato sospeso nel debugger e che non abbia continuato a stampare l'eccezione e la traccia dello stack completo. Lasciare il programma continuare e quindi mostrare il messaggio di eccezione completo e lo stacktrace completo sarebbe utile. Spesso un NPE è avvolto da più eccezioni (la stampa "causata da" nella traccia dello stack) - il messaggio "causato da" più basso è probabilmente il più importante.Inoltre, se conosci il tuo rev, potrebbe essere utile trovare la sorgente da abbinare alla traccia dello stack. –

+0

Bert, se vuoi ripubblicare come risposta, sono disposto ad accettarlo, si potrebbe dire 'spingendo il curriculum si otterrà la traccia dello stack che ho chiesto' – user602347

+0

Non sei l'unica persona che non poteva capirlo! Hai perfettamente ragione - premi play un paio di volte per far scoppiare l'eccezione, e poi guarda LogCat invece della traccia dello stack. Ho usato molti, molti IDE e mi sembra strano che "quale linea del mio codice è andata male" sembrerebbe essere qualcosa che solo gli esperti possono scoprire ... –

risposta

2

mi sono imbattuto il codice esatto e LogCat mi ha dato le seguenti eccezioni:

Caused by: java.lang.NullPointerException 
    at mypackage.test.TestActivity.onCreate(TestActivity.java:23) 

Naturalmente è la dichiarazione

iDareYou.byteValue();

. Questo è chiaro come un giorno luminoso!

Suggerisco che è necessario imparare come utilizzare Dalvik Debug Monitor Server nel modo corretto.

Il log che hai postato sembra abbastanza inutile, hai incasinato alcuni dei filtri LogCat (mi è successo una volta)?

OFFTOPIC: "Dove nel mio codice ho causato l'eccezione?" - Penso che la tua domanda non sia ben formulata.

Penso che il nome corretto di questa domanda potrebbe essere: "Come utilizzare il debugger e LogCat di Android? Alcune eccezioni non sono registrate correttamente! '

+1

Grazie per le vostre opinioni. Credo che il nome della domanda fosse appropriato perché non stavo visualizzando la traccia dello stack con LogCat, stavo usando la finestra Debug in Eclipse/ADT che ho indicato nel nome della domanda. Stai suggerendo che posso risolvere il problema originale con LogCat, che è certamente vero, tuttavia la mia domanda riguardava il motivo per cui la finestra di Eclipse/ADT non mostrava alcuna traccia di stack utile. – user602347

+1

Anche la traccia dello stack non è stata visualizzata in LogCat nel momento in cui il debugger sospende il thread, quindi la risposta non è stata così semplice come non riuscire a interpretare correttamente ciò che è mostrato in LogCat. – user602347

1

In Eclipse l'SDK di Android offre diverse visualizzazioni. Su di esso si chiama "LogCat". Qui puoi trovare le tracce dello stack delle eccezioni

0

Nella mia esperienza, Android mangia le eccezioni causate quando gonfiare un layout. Dovrebbe certamente segnalare l'eccezione, ma a quanto pare alcuni sviluppatori Android hanno deciso di prenderlo e crearne uno nuovo senza aggiungere il primo come cause. Lo vedo come una carenza dell'ambiente Android; perché può essere difficile raggiungere il team di Android con cui ho convissuto fino ad ora, ma lo segnalerei a Google se mi ha davvero infastidito.

+0

Penso che sia vero, ma non lo fa in questo caso. –

Problemi correlati