web-dev-qa-db-fra.com

Comment obtenir les journaux de crash Android?

J'ai une application qui n'est pas sur le marché (signée avec un certificat de débogage), mais qui souhaite obtenir les données du journal des blocages lorsque mon application se bloque. Où puis-je trouver un journal des raisons pour lesquelles mon application est tombée en panne?

136
Sheehan Alam

Si votre application est en cours de téléchargement par d'autres personnes et se bloque sur des appareils distants, vous voudrez peut-être consulter une bibliothèque de rapports d'erreur Android (référencée dans cet SO post ). Si vous ne disposez que de votre propre périphérique local, vous pouvez utiliser LogCat.. Même si le périphérique n'était pas connecté à un ordinateur hôte au moment du crash, connecter le périphérique et émettre une commande adb logcat téléchargera l'historique complet de logcat (au qu’il est mis en mémoire tampon, ce qui correspond généralement à beaucoup de données de journal, ce n’est tout simplement pas infini). Est-ce que l'une ou l'autre de ces options répond à votre question? Sinon, pouvez-vous essayer de clarifier ce que vous cherchez un peu plus?

128
Chris Thompson

Pour ce faire, implémentez l'interface Thread.UncaughtExceptionHandler et transmettez-la à Thread.setDefaultUncaughtExceptionHandler() au début de la onCreate() de votre activité. Voici la classe d'implémentation 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);
    }
}

Note Nous avons laissé le defaultUEH du framework Android pour le gérer.

En haut de votre activité, enregistrez une instance de la classe ci-dessus comme ceci:

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

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

Ce gestionnaire enregistre la trace dans un fichier. Lorsque ReaderScope redémarre la prochaine fois, il détecte le fichier et demande à l'utilisateur s'il souhaite l'envoyer par courrier électronique au développeur.

Pour envoyer la trace de pile par courrier électronique, exécutez le code suivant pour l’emballer dans un courrier électronique. 

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

Vous pouvez également utiliser ACRA Error Reporting System.Just. Inclure le fichier ACRA.jar dans vos bibliothèques de projet et utiliser l'extrait de code ci-dessous avant la déclaration de la classe d'activité du programme de lancement.

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

C'est de http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html

Vous pouvez utiliser adb: 

adb logcat AndroidRuntime:E *:S
29
Kanwar Malik

Vous pouvez essayer ceci depuis la console: -

adb logcat -b crash 

22
Ameer ali khan

Vous pouvez utiliser Apphance. Il s’agit d’un service multi-plateforme (maintenant principalement Android, iOS avec d’autres plateformes sur leur chemin) qui permet de déboguer à distance tout appareil mobile (Android, iOS maintenant - autres en développement). C’est bien plus qu’un simple journal des collisions, c’est bien plus: journalisation, signalement des problèmes par les testeurs, journal des collisions. Cela prend environ 5 minutes à intégrer. Actuellement, vous pouvez demander l'accès à la bêta fermée.

Disclaimer: Je suis CTO de Polidea, une société derrière Apphance et co-créateur de celle-ci.

Mise à jour: Apphance n'est plus la bêta fermée! Mise à jour 2: Apphance est disponible dans http://applause.com offer

11
Jarek Potiuk

Voici une autre solution pour Crash Log.

Le marché Android a un outil nommé "Collecteur de collisions"

vérifier le lien suivant pour plus d'informations

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

7
Ketan Parmar

Si vous utilisez Eclipse, assurez-vous d’utiliser debug et de ne pas exécuter . Assurez-vous d’être dans la perspective de débogage (en haut à droite) Vous devrez peut-être appuyer sur 'Resume' (F8) à quelques reprises pour la log to print . Le journal des pannes se trouvera dans la fenêtre Logcat en bas, double-cliquez pour passer en plein écran et assurez-vous de faire défiler l'écran vers le bas. Vous verrez du texte rouge pour les erreurs, la trace de l'accident sera quelque chose comme 

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

Les parties importantes pour celui-ci sont 

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)

ceux-ci nous disent que c'était une exception hors limites sur la ligne 13 de main.Java dans la méthode onCrate.

7
T. Markle

Vous pouvez utiliser ACRA à partir de this . En incluant cette bibliothèque dans vos projets et en la configurant, vous pourriez recevoir (dans votre courrier électronique ou vos gdocs) leurs rapports d'erreur. Désolé pour mon mauvais anglais.

4
Jesús Manzano

Si vous recherchez un outil de base pour signaler les accidents, essayez crashlytics .

Si vous voulez un outil de rapport plus avancé, Checkout Gryphonet . Il enregistre tous les plantages survenus, ainsi que la ligne de code exacte qui a provoqué le blocage, ainsi que des marqueurs automatiques vous indiquant les étapes que l'utilisateur a suivies avant le blocage, etc.

Bonne chance!

4
Ariel Bell

Utilisez acra crash reporter pour une application Android .. Acra lib

3
Mukesh Y

Voici une solution qui peut vous aider à vider tous les journaux sur un fichier texte

adb logcat -d > logs.txt
2
JGPhilip

Vous pouvez également utiliser la bibliothèque crashcatcher

1
Nikolay Moskvin

Si vous recherchez uniquement le journal des incidents alors que votre téléphone est connecté à l'ordinateur, utilisez la vue DDMS dans Eclipse et le rapport se trouve dans LogCat dans DDMS lorsque votre application se bloque lors du débogage.

0
Jonathan Lin

1) Branchez le téléphone via USB (avec les options de débogage pour développeur activées)

2) Ouvrez le terminal et accédez à votre Android SDK (pour Mac):

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

3) Logcat à partir de ce répertoire (dans votre terminal) pour générer un flux constant de journaux (pour Mac):

./adb logcat

4) Ouvrez votre application qui se bloque pour générer des journaux de crash

5) Ctrl + C pour arrêter le terminal et rechercher les journaux associés à l'application qui se bloque. Il peut dire quelque chose comme ce qui suit:

AndroidRuntime: FATAL EXCEPTION: main

0
Tyler

J'ai créé cette bibliothèque pour résoudre tous vos problèmes . Crash Reporter est un outil pratique pour capturer tous vos accidents et les connecter localement à l'appareil

Ajoutez simplement cette dépendance et vous êtes prêt à partir.

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

Trouvez tous vos collisions sur votre appareil localement et corrigez-les à votre convenance . Les collisions sont enregistrées au format de date et d'heure faciles à suivre. De plus, il fournit également une API pour capturer les exceptions consignées en utilisant la méthode ci-dessous.

CrashRepoter.logException(Exception e)
0
Bali