it-swarm.com.de

Wie bekomme ich Android-Absturzprotokolle?

Ich habe eine App, die nicht auf dem Markt erhältlich ist (mit einem Debug-Zertifikat signiert), aber bei jedem Absturz meiner Anwendung Absturzprotokolldaten erhalten möchte. Wo finde ich ein Protokoll, warum meine App abgestürzt ist?

136
Sheehan Alam

Wenn Ihre App von anderen Benutzern heruntergeladen wird und auf Remote-Geräten abstürzt, möchten Sie möglicherweise eine Android-Fehlerberichterstellungsbibliothek (in this SO post ) referenziert. Wenn es sich nur um ein eigenes lokales Gerät handelt, können Sie LogCat. verwenden. Auch wenn das Gerät bei einem Absturz nicht mit einem Host-Computer verbunden war, wird durch das Anschließen des Geräts und das Ausgeben eines adb logcat-Befehls der gesamte Logcat-Verlauf (zumindest bis zu dem Ausmaß) heruntergeladen dass es gepuffert ist, was in der Regel eine Menge Protokolldaten ist (es ist einfach nicht unendlich). Beantwortet eine dieser Optionen Ihre Frage? Wenn nicht, können Sie versuchen zu klären, wonach Sie ein bisschen mehr suchen?

128
Chris Thompson

Um dies zu erreichen, implementieren Sie die Thread.UncaughtExceptionHandler-Schnittstelle und übergeben diese an Thread.setDefaultUncaughtExceptionHandler() am Anfang Ihrer onCreate()-Aktivität. Hier ist die Implementierungsklasse 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);
    }
}

Hinweis Wir lassen das defaultUEH des Android-Frameworks damit umgehen.

Oben in Ihrem Aktivitätsregister registrieren Sie eine Instanz der obigen Klasse wie folgt:

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

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

Dieser Handler speichert die Ablaufverfolgung in einer Datei. Beim nächsten Neustart von ReaderScope wird die Datei erkannt und der Benutzer wird aufgefordert, ihn per E-Mail an den Entwickler zu senden.

Um das Stack Trace per E-Mail zu versenden, führen Sie den folgenden Code aus, um es 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");

Sie können auch ACRA Error Reporting System verwenden. Fügen Sie die Datei ACRA.jar in Ihre Projektbibliotheken ein und verwenden Sie den folgenden Code-Ausschnitt vor der Deklaration der Launcher-Aktivitätsklasse

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

Dies ist von http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html

Sie können adb verwenden: 

adb logcat AndroidRuntime:E *:S
29
Kanwar Malik

Sie können dies von der Konsole aus versuchen: -

adb Logcat -b Absturz 

22
Ameer ali khan

Sie können Apphance verwenden. Dies ist ein plattformübergreifender Dienst (jetzt hauptsächlich Android, iOS mit anderen Plattformen auf dem Weg), der das Remote-Debugging von jedem mobilen Gerät (Android, iOS jetzt - andere in Entwicklung) ermöglicht. Es ist mehr als nur ein Absturzprotokoll, vielmehr ist es viel mehr: Protokollieren, Melden von Problemen durch Tester, Absturzprotokolle. Die Integration dauert etwa 5 Minuten. Derzeit können Sie den Zugang zur Closed Beta beantragen.

Haftungsausschluss: Ich bin CTO von Polidea, einem Unternehmen hinter Apphance und Mitgestalter.

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

11
Jarek Potiuk

Hier ist eine weitere Lösung für Crash Log.

Android Market hat ein Tool namens "Crash Collector"

Überprüfen Sie den folgenden Link für weitere Informationen

http://kpbird.blogspot.com/2011/08/Android-application-crash-logs.html

7
Ketan Parmar

Wenn Sie Eclipse verwenden, stellen Sie sicher, dass Sie debug verwenden und nicht ausführen. __ Stellen Sie sicher, dass Sie sich in der Debug-Perspektive (oben rechts) befinden log to print . Das Absturzprotokoll befindet sich im Logcat-Fenster unten. Doppelklicken Sie für Vollbild und machen Sie einen Bildlauf nach unten. Sie sehen roten Text für Fehler, die Absturzspur wird ungefähr so ​​aussehen 

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 wichtigen Teile dafür 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)

jene sagen uns, dass es sich um ein Array außerhalb der Grenzen in Zeile 13 von main.Java in der Methode onCrate handelte.

7
T. Markle

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

4
Jesús Manzano

Wenn Sie nach einem grundlegenden Tool für Absturzberichte suchen, versuchen Sie crashlytics .

Wenn Sie ein erweitertes Berichterstellungs-Tool wünschen, Checkout Gryphonet . Es protokolliert alle Abstürze zusammen mit der genauen Codezeile, die den Absturz verursacht hat, sowie automatisierten Markierungen, die Ihnen die Schritte des Benutzers vor dem Absturz und mehr anzeigen.

Viel Glück!

4
Ariel Bell

Verwenden Sie den acra crash reporter für Android-App .. Acra lib

3
Mukesh Y

Hier ist eine Lösung, mit der Sie alle Protokolle in eine Textdatei ausgeben können

adb logcat -d > logs.txt
2
JGPhilip

Sie können auch library crashcatcher verwenden.

1
Nikolay Moskvin

Wenn Sie nur nach dem Absturzprotokoll suchen, während das Telefon mit dem Computer verbunden ist, verwenden Sie die DDMS-Ansicht in Eclipse. Der Bericht befindet sich in LogCat im DDMS, wenn Ihre App beim Debuggen abstürzt.

0
Jonathan Lin

1) Schließen Sie das Telefon über USB an (mit aktivierten Debugging-Optionen für Entwickler)

2) Öffnen Sie das Terminal und navigieren Sie zu Ihrem Android SDK (für Mac):

cd ~/Library/Android/sdk/platform-tools

3) Logcat aus diesem Verzeichnis (in Ihrem Terminal), um einen konstanten Protokollfluss zu generieren (für Mac):

./adb logcat

4) Öffnen Sie Ihre App, die abstürzt, um Absturzprotokolle zu erstellen

5) Strg + C, um das Terminal zu stoppen und nach den Protokollen zu suchen, die der abgestürzten App zugeordnet sind. Es könnte ungefähr so ​​lauten:

AndroidRuntime: FATAL EXCEPTION: main

0
Tyler

Ich habe diese Bibliothek erstellt, um alle Ihre Probleme zu lösen . Crash Reporter ist ein praktisches Werkzeug, um alle Ihre Abstürze zu erfassen und lokal im Gerät zu protokollieren

Fügen Sie einfach diese Abhängigkeit hinzu und Sie können loslegen.

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

Finden Sie alle Ihre Abstürze lokal im Gerät und beheben Sie sie nach Belieben. _. Abstürze werden im einfach zu verfolgenden Datums- und Uhrzeitformat gespeichert. Darüber hinaus bietet es auch eine API für die Erfassung protokollierter Ausnahmen mithilfe der folgenden Methode.

CrashRepoter.logException(Exception e)
0
Bali