2010-09-04 15 views
118

Ich habe eine App, die nicht auf dem Markt ist (mit einem Debug-Zertifikat signiert), aber Crash-Log-Daten erhalten möchte, wenn meine Anwendung abstürzt. Wo kann ich ein Protokoll finden, warum meine App abgestürzt ist?Wie bekomme ich Android-Absturzprotokolle?

+0

[Android-Bibliothek zu erfassen und zu berichten Abstürze] (https://github.com/ajitsing/Sherlock) –

Antwort

116

Wenn Ihre App von anderen Personen heruntergeladen wird und auf Remote-Geräten abstürzt, können Sie in eine Android-Fehlerberichtsbibliothek (in this SO post verwiesen) suchen. Wenn es sich nur um Ihr eigenes lokales Gerät handelt, können Sie LogCat. verwenden. Selbst wenn das Gerät beim Auftreten des Absturzes nicht mit einem Host-Computer verbunden war, wird durch das Anschließen des Geräts und den Befehl adb logcat der gesamte Logcat-Verlauf heruntergeladen dass es gepuffert ist, was normalerweise ein Looot von Log-Daten ist, es ist einfach nicht unendlich). Beantwortet eine dieser Optionen Ihre Frage? Wenn nicht, können Sie versuchen zu klären, wonach Sie suchen?

+2

Kannst du ausführlich erklären, wie du den adb logcat Befehl verwendest? Führe ich das im Verzeichnis/SDK/tools aus?Gibt es irgendwelche Flaggen, die ich beachten sollte? usw. –

+2

@ jesses.coktt Ja, einfach 'adb logcat' von dem Verzeichnis ausführen, in dem sich adb befindet. Alternativ können Sie die SDK-Tools verwenden, die im Eclipse-Plugin enthalten sind. –

+0

Ok, vielen Dank. –

7

Wenn Sie Eclipse verwenden, stellen Sie sicher, dass Sie debuggen und nicht ausführen. Stellen Sie sicher, dass Sie sich in der Debug-Perspektive befinden (oben rechts) Möglicherweise müssen Sie mehrmals auf "Fortsetzen" (F8) drücken, damit das Protokoll gedruckt wird. Das Absturzprotokoll befindet sich im Logcat-Fenster unten - doppelklicken Sie für den Vollbildmodus und stellen Sie sicher, dass Sie nach unten scrollen. Sie werden für Fehler roten Text sehen, wird die Crash-Spur so etwas wie

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 

Die wichtige Teile für diese sind

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) 

die uns sagen, es ist ein Array aus Ausnahme von Schranken für auf Zeile 13 von main.java in der onCrate-Methode.

+0

+1 ok das war sehr albern von mir ... – UncleZeiv

12

Sie können Apphance verwenden. Dies ist ein plattformübergreifender Dienst (jetzt hauptsächlich Android, iOS mit anderen Plattformen auf dem Weg), der es ermöglicht, jedes mobile Gerät (Android, iOS jetzt - andere in der Entwicklung) remote zu debuggen. Es ist viel mehr als nur ein Crashlog, vielmehr ist es viel mehr: Protokollierung, Meldung von Problemen durch Tester, Crashlogs. Es dauert ungefähr 5 Minuten, um sich zu integrieren. Momentan können Sie Zugriff auf die geschlossene Beta anfordern.

Haftungsausschluss: Ich bin CTO von Polidea, einer Firma hinter Apphance und Co-Creator davon.

Update: Apphance ist nicht mehr geschlossen Beta! Update 2: Apphance ist verfügbar als Teil von http://applause.com bietet

+2

Ich habe gerade apphance versucht und mag es. Die Dokumente haben einen wichtigen Punkt bei der Integration von apphance lib in Ihre App verpasst. mit der neuesten Version von Eclipse ADT, müssen Sie die apphance.jar im Verzeichnis 'libs' als [this] setzen (http://stackoverflow.com/a/9916751/9648) SO erklärt die Antwort. [Dieser GitHub-Commit] (https://github.com/johnnylambada/WorldMap/commit/235ac0461a91a080cca2cdcb7fd2059464165406) ​​zeigt die Änderungen, die ich an meiner WorldMap-App vornehmen musste, um apphance zu verwenden. – JohnnyLambada

+0

@HohnnyLambada Danke für Ihren Kommentar. Wir haben die Dokumentation aktualisiert, um dies zu verdeutlichen. –

+12

Dies sollte nicht so viele Pfeile bekommen, es kostet 10x mehr als die meisten Entwicklungsbudgets ($ 2.500 pro Monat!) – user26676

4

Sie können ACRA verwenden aus this. Wenn Sie diese Bibliothek in Ihre Projekte aufnehmen und diese konfigurieren, könnten Sie Ihre Absturzberichte (in Ihre E-Mail oder gdocs) erhalten. Entschuldigung für mein schlechtes Englisch.

0

Wenn Sie nur nach dem Absturzprotokoll suchen, während Ihr Telefon mit dem Computer verbunden ist, verwenden Sie die DDMS-Ansicht in Eclipse und der Bericht befindet sich in LogCat innerhalb von DDMS, wenn Ihre App während des Debuggen abstürzt.

3

Verwenden acra Crash Reporter für android app ..Acra lib

37

Die Art und Weise, dies zu tun ist, um die Thread.UncaughtExceptionHandler Schnittstelle zu implementieren und zu Thread.setDefaultUncaughtExceptionHandler() zu Beginn Ihrer Aktivität des onCreate() passieren. Hier ist die Implementierungsklasse TopExceptionHandler.

Hinweis: Wir lassen das Standard-AUTH des Android-Frameworks verarbeiten.

An der Spitze Ihrer Aktivität registrieren eine Instanz von oben Klasse wie folgt:

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

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

Dieser Handler den Trace in einer Datei speichert. Wenn ReaderScope das nächste Mal neu gestartet wird, erkennt es die Datei und fragt den Benutzer, ob er sie per E-Mail an den Entwickler senden möchte.

Um den Stack Trace per E-Mail zu versenden, führen Sie den folgenden Code aus, um ihn in eine E-Mail zu packen.

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"); 

Oder Sie können auch ACRA Fehlerberichterstattung System.Just verwenden Fügen Sie die ACRA.jar in Ihrem Projekt Libs und verwenden Sie den folgenden Code-Schnipsel vor Launchers Aktivität Klassendeklaration

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

Wird nicht die Zeile defaultUEH.uncaughtException (t, e); Aufruf der Methode uncaughtException() unendlich? –

4

Wenn Sie ein Suchen Sie nach einem grundlegenden Absturzberichtswerkzeug, versuchen Sie crashlytics.

Wenn Sie eine erweiterte Reporting-Tool benötigen, Checkout Gryphonet. Es protokolliert alle Abstürze zusammen mit der genauen Codezeile, die den Absturz verursacht hat, sowie automatisierte Markierungen, die Ihnen die Schritte zeigen, die der Benutzer vor dem Absturz gemacht hat, und mehr.

Viel Glück!

-1

Versuchen Sie Carsh Log App von Android.

Verwenden Sie die link App zum Herunterladen.

0

Ich habe diese Bibliothek erstellt, um alle Ihre Probleme zu lösen. Crash Reporter is a handy tool to capture all your crashes and log them in device locally

Fügen Sie einfach diese Abhängigkeit und Sie sind gut zu gehen.

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

Finden Sie alle Ihre Abstürze im Gerät lokal und beheben Sie sie nach Ihren Wünschen. Abstürze werden gespeichert, indem Datum und Uhrzeit Format einfach zu verfolgen. Darüber hinaus bietet es auch eine API für die Erfassung von protokollierten Ausnahmen unter Verwendung der Methode "unten".

CrashRepoter.logException(Exception e) 
+0

Was ist die Java-Klasse, die Sie verwendet haben, um die Crash-Logs eines Geräts zu erhalten? – Xenolion

1

können Sie versuchen, diese von der Konsole: -

adb logcat -b Absturz