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?
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?
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)
C'est de http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html
Vous pouvez utiliser adb:
adb logcat AndroidRuntime:E *:S
Vous pouvez essayer ceci depuis la console: -
adb logcat -b crash
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
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
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.
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.
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!
Utilisez acra crash reporter pour une application Android .. Acra lib
Voici une solution qui peut vous aider à vider tous les journaux sur un fichier texte
adb logcat -d > logs.txt
Vous pouvez également utiliser la bibliothèque crashcatcher
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.
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
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)