2010-09-04 74 views
118

Ho un'app che non si trova sul mercato (firmata con un certificato di debug), ma vorrei ottenere i dati del registro di crash, ogni volta che la mia applicazione si blocca. Dove posso trovare un registro dei motivi per cui la mia app si è bloccata?Come ottenere i registri degli arresti anomali di Android?

+0

[biblioteca Android di catturare e segnalare crash] (https://github.com/ajitsing/Sherlock) –

risposta

116

Se la tua app viene scaricata da altre persone e si blocca su dispositivi remoti, è consigliabile esaminare una libreria di segnalazione degli errori Android (riferimento in this SO post). Se è solo sul proprio dispositivo locale, è possibile utilizzare LogCat. Anche se il dispositivo non era connesso a un computer host quando si è verificato l'arresto anomalo, il collegamento del dispositivo e l'emissione di un comando adb logcat scaricheranno l'intera cronologia logcat (almeno nella misura che è buffered che di solito è un loooot di dati di log, non è semplicemente infinito). Una di queste opzioni risponde alla tua domanda? Se no, puoi tentare di chiarire che cosa stai cercando un po 'di più?

+2

puoi dettagliare come usare il comando adb logcat? Lo faccio all'interno della directory/SDK/tools?Ci sono delle bandiere che dovrei notare? ecc. –

+2

@ jesses.co.tt Sì, basta eseguire 'adb logcat' da qualunque directory adb si trovi. In alternativa è possibile utilizzare gli strumenti SDK inclusi nel plugin Eclipse –

+0

Ok, grazie mille. –

7

Se si utilizza Eclipse, assicurarsi di utilizzare il debug e non eseguire. Assicurati di essere nella prospettiva di debug (in alto a destra) Potrebbe essere necessario premere 'Riprendi' (F8) alcune volte affinché il registro stampi. Il registro degli arresti anomali si troverà nella finestra Logcat in basso, doppio clic per schermo intero e assicurati di scorrere verso il basso. Vedrete testo rosso per gli errori, la traccia incidente sarà qualcosa di simile

09-04 21:35:15.228: ERROR/AndroidRuntime(778): Uncaught handler: thread main exiting due to uncaught exception 
09-04 21:35:15.397: ERROR/AndroidRuntime(778): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dazlious.android.helloworld/com.dazlious.android.helloworld.main}: java.lang.ArrayIndexOutOfBoundsException 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.ActivityThread.access$1800(ActivityThread.java:112) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.os.Looper.loop(Looper.java:123) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at java.lang.reflect.Method.invoke(Method.java:521) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at dalvik.system.NativeStart.main(Native Method) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at com.example.android.helloworld.main.onCreate(main.java:13) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  ... 11 more 

Le parti importanti per questo sono

09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):  at com.example.android.helloworld.main.onCreate(main.java:13) 

chi ci dicono che era una serie di eccezioni limiti su su riga 13 di main.java nel metodo onCrate.

+0

+1 ok questo è stato molto sciocco da parte mia ... – UncleZeiv

12

È possibile utilizzare Apphance. Si tratta di un servizio multipiattaforma (ora principalmente Android, iOS con altre piattaforme sulla loro strada) che consente di eseguire il debug da remoto su qualsiasi dispositivo mobile (Android, iOS ora - altri in fase di sviluppo). È molto più di un semplice crashlog, anzi è molto di più: logging, segnalazione di problemi da parte di tester, crashlogs. Ci vogliono circa 5 minuti per integrarsi. Attualmente è possibile richiedere l'accesso alla versione beta chiusa.

Disclaimer: Sono CTO di Polidea, una società dietro Apphance e co-creatore di esso.

Aggiornamento: Apphance non è più closed beta! Aggiornamento 2: Apphance è disponibile come parte di http://applause.com offrendo

+2

Ho appena provato l'apphance e mi piace. I documenti hanno perso un punto chiave quando si integrava apphance lib nella tua app; con l'ultima versione di Eclipse ADT, è necessario inserire l'apphance.jar nella directory 'libs' come [this] (http://stackoverflow.com/a/9916751/9648). SO spiega la risposta. [Questo github commit] (https://github.com/johnnylambada/WorldMap/commit/235ac0461a91a080cca2cdcb7fd2059464165406) ​​mostra le modifiche che dovevo apportare alla mia app WorldMap per utilizzare apphance. – JohnnyLambada

+0

@HohnnyLambada Grazie per il tuo commento. Abbiamo aggiornato la documentazione per renderla più chiara. –

+12

questo non dovrebbe ottenere così tante frecce in su costa 10 volte più della maggior parte dei budget di sviluppo ($ 2.500 al mese!) – user26676

4

È possibile utilizzare ACRA da this. Includendo questa libreria per i tuoi progetti e configurandola, potresti ricevere (nella tua email o gdocs) i loro rapporti sugli arresti anomali. Scusa per il mio cattivo inglese.

0

Se stai cercando il registro di emergenza mentre il telefono è collegato al computer, utilizza la vista DDMS in Eclipse e il rapporto è proprio lì in LogCat in DDMS quando l'app si arresta in modo anomalo durante il debug.

3

Usa Acra incidente giornalista per Android ..Acra lib

37

Il modo per farlo è quello di implementare l'interfaccia Thread.UncaughtExceptionHandler e passarlo al Thread.setDefaultUncaughtExceptionHandler() all'inizio della vostra attività di onCreate(). Ecco la classe di implementazione TopExceptionHandler.

public class TopExceptionHandler implements Thread.UncaughtExceptionHandler { 
    private Thread.UncaughtExceptionHandler defaultUEH; 
    private Activity app = null; 

    public TopExceptionHandler(Activity app) { 
     this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
     this.app = app; 
    } 

    public void uncaughtException(Thread t, Throwable e) { 
     StackTraceElement[] arr = e.getStackTrace(); 
     String report = e.toString()+"\n\n"; 
     report += "--------- Stack trace ---------\n\n"; 
     for (int i=0; i<arr.length; i++) { 
      report += " "+arr[i].toString()+"\n"; 
     } 
     report += "-------------------------------\n\n"; 

     // If the exception was thrown in a background thread inside 
     // AsyncTask, then the actual exception can be found with getCause 

     report += "--------- Cause ---------\n\n"; 
     Throwable cause = e.getCause(); 
     if(cause != null) { 
      report += cause.toString() + "\n\n"; 
      arr = cause.getStackTrace(); 
      for (int i=0; i<arr.length; i++) { 
       report += " "+arr[i].toString()+"\n"; 
      } 
     } 
     report += "-------------------------------\n\n"; 

     try { 
      FileOutputStream trace = app.openFileOutput("stack.trace", 
                 Context.MODE_PRIVATE); 
      trace.write(report.getBytes()); 
      trace.close(); 
     } catch(IOException ioe) { 
     // ... 
     } 

     defaultUEH.uncaughtException(t, e); 
    } 
} 

Nota Lasciamo che il predefinito del framework AndroidUEH lo gestisca.

Nella parte superiore della tua attività Iscriviti un'istanza della classe sopra in questo modo:

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this)); 
... 

Questo gestore salva la traccia in un file. Al successivo riavvio, ReaderScope, rileva il file e richiede all'utente se desidera inviarlo via email allo sviluppatore.

Per inviare via email la traccia di stack, eseguire il seguente codice per comprimerlo in un messaggio di posta elettronica.

try { 
    BufferedReader reader = new BufferedReader(
     new InputStreamReader(ReaderScopeActivity.this.openFileInput("stack.trace"))); 
    while((line = reader.readLine()) != null) { 
     trace += line+"\n"; 
    } 
} catch(FileNotFoundException fnfe) { 
    // ... 
} catch(IOException ioe) { 
    // ... 
} 

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
String subject = "Error report"; 
String body = "Mail this to [email protected]: " + "\n" + trace + "\n"; 

sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 
sendIntent.putExtra(Intent.EXTRA_TEXT, body); 
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
sendIntent.setType("message/rfc822"); 

ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:")); 

ReaderScopeActivity.this.deleteFile("stack.trace"); 

Oppure si può anche utilizzare ACRA Segnalazione errori System.Just Calcola l'ACRA.jar nelle vostre librerie di progetto e utilizzare il frammento di codice sotto prima del vostro launcher dichiarazione di classe di attività

@ReportsCrashes(formKey = "", mailTo = "[email protected];[email protected]", mode = ReportingInteractionMode.SILENT) 
+0

La linea non sarà predefinitaUEH.uncaughtException (t, e); chiamare il metodo uncaughtException() infinitamente? –

4

Se un Alla ricerca di uno strumento di segnalazione degli arresti di base, prova crashlytics.

Se si desidera uno strumento di reporting più avanzato, Checkout Gryphonet. Registra tutti gli arresti occorsi insieme alla riga esatta di codice che ha causato l'arresto anomalo insieme a marcatori automatici che mostrano i passaggi che l'utente ha intrapreso prima dell'incidente e altro ancora.

Buona fortuna!

-1

Prova l'app di log Carsh da Android.

utilizzare l'link per scaricare l'app.

0

Ho creato questa libreria per risolvere tutti i tuoi problemi. Crash Reporter is a handy tool to capture all your crashes and log them in device locally

Basta aggiungere questa dipendenza e sei a posto.

compile 'com.balsikandar.android:crashreporter:1.0.1' 

Trova localmente tutti i tuoi arresti anomali nel dispositivo e li aggiusta a tuo piacimento. Gli arresti vengono salvati utilizzando il formato di data e ora facile da tracciare. Inoltre, fornisce anche API per l'acquisizione delle eccezioni registrate utilizzando il metodo seguente.

CrashRepoter.logException(Exception e) 
+0

Qual è la classe Java che hai usato per ottenere i registri degli arresti anomali di un dispositivo? – Xenolion

1

Si può provare questo da console: -

adb logcat -b incidente

Problemi correlati