Comment obtenir Android crash logs?
j'ai une application qui n'est pas sur la place du marché (signée avec un certificat de débogage), mais qui voudrait obtenir des données de journal de crash, chaque fois que mon application plante. Où puis-je trouver un journal de pourquoi mon application s'est écrasé?
15 réponses
si votre application est téléchargée par d'autres personnes et s'écrase sur des appareils distants, vous pouvez vouloir regarder dans une bibliothèque de rapports D'erreur Android (référencée dans ce SO post ). Si c'est seulement sur votre propre appareil local, vous pouvez utiliser LogCat.
même si l'appareil n'était pas connecté à une machine hôte au moment du crash, la connexion de l'appareil et l'émission d'une commande adb logcat
téléchargera toute l'histoire logcat (au moins dans la mesure où il est tamponné qui est généralement un loooot de données de journal, il est tout simplement pas infinie). Est-ce que l'une ou l'autre de ces options répond à votre question? Si ce n'est pas le cas, Pouvez-vous essayer de clarifier ce que vous cherchez un peu plus?
la façon de procéder est de mettre en œuvre l'interface Thread.UncaughtExceptionHandler
et de la passer à Thread.setDefaultUncaughtExceptionHandler()
au début de votre activité onCreate()
. 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);
}
}
Remarque Nous laisser le Android du cadre de defaultUEH de le gérer.
au sommet de votre activité enregistrer une instance de classe supérieure 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 si il/elle veut l'envoyer par courriel au développeur.
pour envoyer la trace de la pile, exécutez le code suivant pour l'emballer dans un e-mail.
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 appdeveloper@gmail.com: " + "\n" + trace + "\n";
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"readerscope@altcanvas.com"});
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");
ou vous pouvez également utiliser le système de déclaration des erreurs ACRA.Incluez juste L'ACRA.jar dans vos libs de projet et d'utiliser l'extrait de code ci-dessous avant votre classe d'activité du lanceur déclaration
@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", 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 cela depuis la console: -
ADB logcat-B crash
vous pouvez utiliser Apphance. Il s'agit d'un service multi-plateforme (désormais principalement Android, iOS avec d'autres plateformes en route) qui permet de déboguer à distance n'importe quel appareil mobile (Android, iOS maintenant - autres en développement). C'est bien plus qu'un crashlog, en fait c'est bien plus: journalisation, rapports de problèmes par testeurs, crashlogs. L'intégration prend environ 5 minutes. Actuellement, vous pouvez demander l'accès à la bêta fermée.
Avertissement: je suis directeur technique de Polidea, un société derrière Apphance et co-créateur de.
mise à jour: Apphance n'est plus fermé bêta! Maj 2: Apphance est disponible dans le cadre de http://applause.com offrande
si vous utilisez Eclipse, assurez-vous d'utiliser debug et ne pas exécuter. Assurez-vous que vous êtes dans la perspective de débogage (en haut à droite) Vous devrez peut-être cliquer sur "Resume" (F8) à quelques reprises pour que le journal de bord soit imprimé. Le journal de crash sera dans la fenêtre Logcat en bas - double clic pour Plein écran et assurez-vous de faire défiler vers le bas. Vous verrez le texte rouge pour les erreurs, la trace de crash 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.access00(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 nous disent que c'était une exception hors limites sur la ligne 13 de main.java dans la méthode onCrate.
Voici une autre solution pour Crash Log.
Android market A outil nommé "Crash Collector"
vérifier le lien suivant pour plus d'information
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html
vous pouvez utiliser ACRA de ce . En incluant cette bibliothèque à vos projets et en la configurant, vous pourriez recevoir (dans votre e-mail ou gdocs) leurs rapports de crash. Désolé pour mon mauvais anglais.
si vous cherchez un outil de base pour signaler un accident, essayez crashlytics .
si vous voulez un outil de rapport plus avancé, la commande Gryphonet . Il enregistre tous les crashs qui se sont produits ainsi que la ligne exacte de code qui a causé le crash avec des marqueurs automatiques qui vous montrent les étapes que l'Utilisateur a prises avant le crash et plus encore.
bonne chance!
Voici une solution qui peut vous aider à vider toutes les logs sur un fichier texte
adb logcat -d > logs.txt
vous pouvez également utiliser la bibliothèque crashcatcher
si vous êtes juste à la recherche du journal de crash pendant que votre téléphone est connecté à l'ordinateur, utilisez la vue DDMS dans Eclipse et le rapport est juste là dans LogCat dans DDMS lorsque votre application plante pendant le débogage.
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 enregistrer dans le périphérique localement
il suffit d'ajouter cette dépendance et vous êtes prêt à partir.
compile 'com.balsikandar.android:crashreporter:1.0.1'
trouvez tous vos accidents dans l'appareil localement et réparez-les à votre convenance. Les accidents sont enregistrés en utilisant le format date et heure Facile à suivre. De plus, il fournit également L'API pour les Exceptions de capture ci-dessous la méthode.
CrashRepoter.logException(Exception e)
essayez L'application carsh log d'android.
utilisez le lien pour télécharger app.