Malheureusement, MyApp s'est arrêté. Comment puis-je resoudre ceci?

787

Je développe une application, et chaque fois que je l'exécute, je reçois le message:

Malheureusement, MyApp s'est arrêté.

Que puis-je faire pour résoudre ce problème?


À propos de cette question - évidemment inspirée par Qu'est-ce qu'une trace de pile et comment puis-je l'utiliser pour déboguer mes erreurs d'application? , de nombreuses questions indiquent que leur application a planté, sans plus de détails. Cette question vise à expliquer aux programmeurs Android novices comment essayer de résoudre eux-mêmes leurs problèmes ou à poser les bonnes questions.

nhaarman
la source
22
J'ai vu beaucoup de questions se refermer comme dupes avec ça. C'est une bonne référence pour aider les gens à publier des données pertinentes dans leurs questions. Cependant, ce n'est pas un doublon d'un problème racine, mais simplement une méthodologie pour creuser le problème racine. Je pense qu'il serait préférable de fournir le lien vers cette question comme référence et de ne pas fermer en double.
laalto
33
Je pense que la fonction de fermeture est parfaite pour cela. La plupart de ces questions montrent peu de connaissances sur les compétences de base de débogage. Les mettre en attente leur permet de clarifier leur problème, en utilisant la méthode indiquée dans la réponse. Mieux encore, ils pourraient résoudre le problème eux-mêmes. Cette discussion pourrait cependant être mieux adaptée à meta.stackoverflow.com.
nhaarman
Cette question est trop vague. Une meilleure question serait «en utilisant [myIDE] comment déboguer» une application Android qui affiche l'erreur «Malheureusement, MyApp s'est arrêtée»
Chris Halcrow
7
@ChrisHalcrow Ce Q / A ne concerne pas du tout le débogage. Il s'agit de guider les débutants dans Android pour gérer les plantages d'applications.
nhaarman
stackoverflow.com/questions/26609734/… .. activez l'erreur becides multidex lors de la conversion en
apk

Réponses:

719

Cette réponse décrit le processus de récupération de la trace de pile. Vous avez déjà la trace de la pile? Lisez sur les traces de pile dans " Qu'est-ce qu'une trace de pile et comment puis-je l'utiliser pour déboguer mes erreurs d'application? "

Le problème

Votre application a quitté car un non capturé a RuntimeExceptionété lancé.
Le plus courant est le NullPointerException.

Comment le résoudre?

Chaque fois qu'une application Android se bloque (ou n'importe quelle application Java d'ailleurs), a Stack traceest écrit sur la console (dans ce cas, logcat). Cette trace de pile contient des informations vitales pour résoudre votre problème.

Android Studio

Recherche de la trace de pile dans Android Studio

Dans la barre inférieure de la fenêtre, cliquez sur le Logcatbouton. Vous pouvez également appuyer sur alt+ 6. Assurez-vous que votre émulateur ou appareil est sélectionné dans le Devicespanneau. Ensuite, essayez de trouver la trace de la pile, qui apparaît en rouge. Il peut y avoir beaucoup de choses connectées à logcat, vous devrez donc peut-être faire défiler un peu. Un moyen simple de trouver la trace de la pile consiste à effacer le logcat (en utilisant la corbeille à droite) et à laisser l'application se bloquer à nouveau.

J'ai trouvé la trace de la pile, maintenant quoi?

Yay! Vous êtes à mi-chemin pour résoudre votre problème.
Il vous suffit de découvrir ce qui a exactement fait planter votre application, en analysant la trace de la pile.

Lisez sur les traces de pile dans " Qu'est-ce qu'une trace de pile et comment puis-je l'utiliser pour déboguer mes erreurs d'application? "

Je ne peux toujours pas résoudre mon problème!

Si vous avez trouvé votre Exceptionligne et où elle s'est produite, et que vous ne savez toujours pas comment y remédier, n'hésitez pas à poser une question sur StackOverflow.

Essayez d'être aussi concis que possible: affichez la trace de la pile et le code correspondant (par exemple, quelques lignes jusqu'à la ligne qui l'a lancé Exception).

nhaarman
la source
33
Je sais que ce message est ancien: mais si vous utilisez IntelliJ IDEA, vous pouvez aller à l'intérieur Android > Devices|Logcatet ajouter un nouveau filtre ( i.imgur.com/145dtkx.png ), et le filtrer by Log Messageici, vous pouvez le mettre FATAL EXCEPTION( i.imgur.com/HpELhaU .png ) donc dans cette boîte vous pouvez lire tout Exceptionsce qui est jeté par votre application. Avec cela, vous n'avez pas besoin d'effacer logcat et de refaire le plantage. Je pense qu'Android Studio a également cette option.
Marco Acierno
1
Le filtrage de logcat dans Eclipse peut être effectué en tapant le nom du package java dans le champ du nom de l'application du filtre.
Stephane
Je pense que le point principal est de comprendre la trace que l'on obtient lorsque l'exception se produit. Les FC sont un peu mauvais quand il n'y a pas de trace ou pas utilisable, c'est là qu'il devient poilu. mais je pense que cette explication est une belle première introduction pour trouver / identifier de tels bugs.
DooMMasteR
4
Les choses sont faciles lorsque votre logcat a une trace d'erreur, mais qu'en cas de logcat n'a rien? stackoverflow.com/questions/32455645/…
Marian Paździoch
4
Le problème est que la ligne ne contient pas l'erreur qui est écrite et pointée par la trace de pile.
Hilal
117

Vous pouvez utiliser l'outil de la BAD de Google pour obtenir Logcat filed'analyser la question.

adb logcat > logcat.txt

ouvrez le logcat.txtfichier et recherchez le nom de votre application. Il devrait y avoir des informations sur la raison de l'échec, le numéro de ligne, le nom de la classe, etc.

Vlad Bezden
la source
C'est génial, cela vous montrera rapidement tout ce qui se passe sur l'appareil même si votre débogueur ne parvient pas à le détecter, ce qui peut arriver pour Xamarin si le runtime ne se charge pas.
jvenema
1
Je ne pouvais pas voir pourquoi mon application se bloquait dans le logcat du studio Android, il n'y avait aucune erreur. Cette réponse m'a donné ce dont j'avais besoin. Plus tard, cependant, j'ai réalisé que j'avais un filtre dans le studio logcat, ce qui m'empêchait de voir l'erreur. Je suis revenu à "Afficher uniquement l'application sélectionnée" et j'étais de nouveau opérationnel.
Yannick
vous devez ajouter -d, sinon vous devez appuyer sur ctrl-C pour quitter logcat. Je faisadb logcat -v time -d > filename.txt
Karakuri
37

Tout d'abord, vous vérifiez à quel point votre application est tombée en panne ( Unfortunately, MyApp has stopped.). Pour cela, vous pouvez utiliser Log.e("TAG", "Message");, en utilisant cette ligne, vous pouvez voir le journal de votre application dans logcat.

Après cela, vous trouvez quel point votre application s'est arrêtée est très facile à résoudre à vos côtés.

Hiren Vaghela
la source
28

Vérifiez simplement l'erreur dans le journal de chat.

Vous obtenez l'option log cat dans eclipse:

fenêtre-> afficher la vue-> autres-> Android-> Logcat

Le chat de journal contient une erreur.

Sinon, vous pouvez également vérifier l'erreur en exécutant une application en mode débogage. Définissez d'abord le point d'arrêt après cela en faisant:

clic droit sur projet-> déboguer en tant que-> application Android

Rahil Ali
la source
27

Remarque: Cette réponse utilise Android Studio 2.2.2

Remarque 2: je considère que votre appareil est correctement connecté.


La première chose que vous faites lorsque votre application se bloque est de regarder dans LogCat, au bas d'Android Studio, il y a une barre d'outils avec une liste de menus:

image

Cliquez sur "Android Monitor" (celui que j'ai souligné dans l'image ci-dessus. ^)

Maintenant, vous obtiendrez quelque chose comme ceci:

image

Remplacez " Verbose" par " Error" Maintenant, seules les erreurs enregistrées seront affichées. Ne vous inquiétez pas de toutes ces erreurs (si vous les avez) maintenant.

image

D'accord. Maintenant, faites ce que vous avez fait pour planter votre application. Après le blocage de votre application, accédez à votre logcat. Vous devriez trouver un nouveau journal des plantages qui contient beaucoup de at:x.x.x: et Caused by: TrumpIsPresidentExceptionpar exemple. Accédez à cette Caused by:déclaration dans votre logcat.

image

À côté de cela Caused By:, il devrait y avoir l'exception qui s'est produite. Dans mon cas, c'est un RuntimeExceptionet en dessous il devrait y avoir une ligne qui contient un lien bleu tel que:

image

Si celaCaused by: N'A PAS de ligne avec un texte bleu quelque part en dessous, alors cherchez une autre Caused by:qui en a.

Cliquez sur ce lien bleu . Il devrait vous emmener là où le problème est survenu. Dans mon cas, c'était dû à cette ligne:

throw new RuntimeException();

Donc, maintenant je sais pourquoi ça plante. C'est parce que je lève moi-même l'exception. C'était une erreur évidente .


Cependant, disons que j'ai une autre erreur:

java.lang.NullPointerException

J'ai vérifié mon logcat, j'ai cliqué sur le lien bleu qu'il m'a donné, et il m'a amené ici:

mTextView.setText(myString);

Donc, maintenant je veux déboguer. Selon cette question StackOverflow , une NullPointerException indique que quelque chose existe null.

Voyons donc ce qui est nul . Il y a deux possibilités. Soit mTextViewnull, soit myStringnull. Pour savoir, avant la mTextView.setText(mString)ligne, j'ajoute ces deux lignes:

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);

Maintenant, comme nous l'avons fait précédemment (nous avons changé Verose en Error), nous voulons changer "Error" en "Debug". Puisque nous nous connectons par débogage. Voici toutes les méthodes de journalisation:

Log.
  d means Debug
  e means error
  w means warning
  v means verbose
  i means information
  wtf means "What a terrible failure". This is similar to Log.e

Donc, depuis que nous l'avons utilisé Log.d, nous archivons Debug. C'est pourquoi nous l'avons changé pour déboguer.

Remarque Log.da un premier paramètre, dans notre cas "AppDebug". Cliquez sur le menu déroulant "Pas de filtres" en haut à droite du logcat. Sélectionnez "Modifier la configuration du filtre", donnez un nom à votre filtre et dans "Log Tag", mettez "App Debug". Cliquez sur OK". Maintenant, vous devriez voir deux lignes dans le logcat:

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false

Alors maintenant, nous savons que mTextView est nul.

J'observe mon code, maintenant je remarque quelque chose.

Je l'ai private TextView mTextViewdéclaré en tête de ma classe. Mais je ne le définis pas.

Fondamentalement, j'ai oublié de le faire dans mon onCreate ():

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

Voilà pourquoi mTextViewest nul, car j'ai oublié de dire à mon application de quoi il s'agit. J'ajoute donc cette ligne, exécute mon application et maintenant l'application ne plante plus.


Un B
la source
1
C'est une bonne information, mais l' utilisation d'images de la trace de pile diminue son utilité - les images ne peuvent pas être recherchées, ne peuvent pas être copiées et collées, ne peuvent pas être récupérées par les lecteurs d'écran et sont plus difficiles à lire. (Au fait, je n'ai pas dévalorisé, je l'ai simplement souligné).
EJoshuaS
1
@EJoshuaS Je n'ai pas dit de fournir des images.
Ab
19

Cette fenêtre apparaît uniquement lorsque vous obtenez une exception fatale dans votre code qui arrête l'exécution de l'application. Cela pourrait être n'importe quelle exception NullPointerException, OutOfMemoryExceptionetc.

La meilleure façon de vérifier est via Logcat si vous développez toujours l'application dans Android studio, qui est un moyen rapide de lire la trace de la pile et de vérifier la cause de l'application.

Si votre application est déjà en ligne, vous ne pouvez pas utiliser logcat . Donc, pour cela, vous pouvez implémenter Crashlyticspour vous fournir des rapports de bogues de toute exception qui se produit.

Ani
la source
17

Vérifiez votre Logcatmessage et consultez votre Manifestfichier. Il devrait y avoir quelque chose qui manque comme la définition de l' Activity,autorisation de l' utilisateur », etc.

Manoj ahirwar
la source
14

Vous pouvez utiliser n'importe lequel de ces outils:

  1. adb logcat

  2. adb logcat> logs.txt (vous pouvez utiliser des éditeurs pour ouvrir et rechercher des erreurs.)

  3. eclipse logcat (si non visible dans eclipse, allez dans Windows-> Afficher la vue-> Autres-> Android-> LogCat)

  4. Android Debug Monitor ou Android Device Monitor (tapez moniteur de commande ou ouvrez via l'interface utilisateur)

entrez la description de l'image ici

  1. Android Studio

Je suggère d'utiliser Android Debug Monitor , c'est bon. Parce que l'éclipse se bloque quand trop de journaux sont là, et à travers le filtre adcat logcat et tout est difficile.

Shiv Buyya
la source
12

Vous devez vérifier le Stack trace

Comment faire ça?

sur votre IDE Vérifiez le formulaire Windows LOGCAT

Si vous ne pouvez pas voir les fenêtres logcat, accédez à ce chemin et ouvrez-le.

window->show view->others->Android->Logcat

si vous utilisez Google-Api, allez sur ce chemin

adb logcat> logcat.txt

alireza amini
la source
10

Dans la méthode showToast () ci-dessous, vous devez passer un autre paramètre pour le contexte ou le contexte d'application en le faisant, vous pouvez l'essayer.

  public void showToast(String error, Context applicationContext){
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)      
        findViewById(R.id.toast_root));
        TextView text = (TextView) findViewById(R.id.toast_error);
        text.setText(error);
        Toast toast = new Toast(applicationContext);
        toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(view);
        toast.show();
}
Mayank Nema
la source
9

Permettez-moi de partager une analyse Logcat de base lorsque vous rencontrez une fermeture forcée (lorsque l'application cesse de fonctionner).

DOCS

L'outil de base d'Android pour collecter / analyser les journaux est le logcat.

ICI est la page Android sur logcat

Si vous utilisez Android Studio, vous pouvez également vérifier ce LIEN .

Capture

Fondamentalement, vous pouvez capturer MANUELLEMENT logcat avec la commande suivante (ou simplement vérifier la fenêtre AndroidMonitor dans AndroidStudio):

adb logcat

Il y a beaucoup de paramètres que vous pouvez ajouter à la commande qui vous aident à filtrer et afficher le message que vous voulez ... C'est personnel ... J'utilise toujours la commande ci-dessous pour obtenir l'horodatage du message:

adb logcat -v time

Vous pouvez rediriger la sortie vers un fichier et l'analyser dans un éditeur de texte.

en cours d'analyse

Si votre application se bloque, vous obtiendrez quelque chose comme:

07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.khan.abc, PID: 21144
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
     at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
     at android.view.View.performClick(View.java:4848)
     at android.view.View$PerformClick.run(View.java:20262)
     at android.os.Handler.handleCallback(Handler.java:815)
     at android.os.Handler.dispatchMessage(Handler.java:104)
     at android.os.Looper.loop(Looper.java:194)
     at android.app.ActivityThread.main(ActivityThread.java:5631)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9

Cette partie du journal vous montre beaucoup d'informations:

  • Lorsque le problème est survenu: 07-09 08:29:13.475

Il est important de vérifier quand le problème s'est produit ... Vous pouvez trouver plusieurs erreurs dans un journal ... vous devez être sûr de vérifier les messages appropriés :)

  • Quelle application s'est bloquée: com.example.khan.abc

De cette façon, vous savez quelle application est tombée en panne (pour être sûr de vérifier les journaux de votre message)

  • Quelle erreur: java.lang.NullPointerException

Une erreur d'exception de pointeur NULL

  • Informations détaillées sur l'erreur: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Vous avez essayé d'appeler la méthode à onBackPressed()partir d'un FragmentActivityobjet. Cependant, cet objet était nullquand vous l'avez fait.

  • Stack Trace: Stack Trace vous montre l'ordre d'appel de la méthode ... Parfois, l'erreur se produit dans la méthode appelante (et non dans la méthode appelée).

    sur com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)

Une erreur s'est produite dans le fichier com.example.khan.abc.AudioFragment.java, à l'intérieur de la onClick()méthode à la ligne: 125(stacktrace affiche la ligne sur laquelle l'erreur s'est produite)

Il a été appelé par:

at android.view.View.performClick(View.java:4848)

Qui a été appelé par:

at android.view.View$PerformClick.run(View.java:20262)

qui a été appelé par:

at android.os.Handler.handleCallback(Handler.java:815)

etc....

Aperçu

Ce n'était qu'un aperçu ... Tous les journaux ne sont pas simples, etc. Il s'agit simplement de partager l'idée et de vous fournir des informations d'entrée de gamme ...

J'espère que je pourrais vous aider de toute façon ... Cordialement

W0rmH0le
la source
8

Utilisez LogCat et essayez de trouver ce qui provoque le blocage de l'application.

Pour voir Logcat si vous utilisez Android Studio, appuyez sur ALT + 6 ou

si vous utilisez Eclipse, alors Window -> Open Perspective -> Other - LogCat

Accédez à LogCat, dans le menu déroulant, sélectionnez erreur. Celui-ci contiendra toutes les informations nécessaires pour vous aider à déboguer. Si cela ne vous aide pas, postez le LogCat en tant que modification de votre question et quelqu'un vous aidera.

Biswajit Karmakar
la source
7

Si votre application se bloque pour une raison quelconque sans une bonne trace de pile. Essayez de le déboguer à partir de la première ligne et continuez ligne par ligne jusqu'au plantage. Ensuite, vous aurez la réponse, quelle ligne vous pose problème. Vous pouvez ensuite l'envelopper dans le bloc try catch et imprimer la sortie d'erreur.

felislynx.silae
la source
5

Vous pouvez également obtenir ce message d'erreur de lui-même, sans trace de pile ni autre message d'erreur.

Dans ce cas, vous devez vous assurer que votre manifeste Android est correctement configuré (y compris toute fusion de manifeste se produisant à partir d'une bibliothèque et toute activité qui proviendrait d'une bibliothèque), et accorder une attention particulière à la première activité affichée dans votre application dans vos fichiers manifeste .

Pelpotronic
la source
3
Je serais intéressé si vous pouviez télécharger un projet qui illustre ce phénomène.
CommonsWare
5

Crash pendant le développement

Essayez mon outil préféré logview pour obtenir les journaux et les analyser pendant le développement.
Assurez-vous de marquer ./logviewet ./lib/logview.jarcomme exécutable lors de l'exécution sous Linux.

Si vous ne l'aimez pas, il existe de nombreuses autres visionneuses de journaux de bureau pour Android .

Crash dans la nature

Intégrez un outil de rapport d' incident en temps réel tel que Firebase Crashlytics afin d'obtenir des traces de pile d'exceptions non gérées qui se sont produites sur les appareils des utilisateurs.

Lisez Comment publier une application de buggy (et vivre pour raconter l'histoire) pour en savoir plus sur la gestion des bugs sur le terrain.

naXa
la source
4

Les gens font des erreurs, et donc aussi du codage.

Chaque fois que errorcela se produit, vérifiez toujours avec le logcat avec le texte en couleur rouge, mais vous pouvez découvrir le vrai problème dans le texte en couleur bleue avec un soulignement dans le texte en couleur rouge.

Assurez-vous que si vous créez un nouveau activity, déclarez toujours le activitydans le AndroidManifestfichier.

Si vous ajoutez une autorisation, déclarez-la également dans le AndroidMainifestfichier.

Kopi Bryant
la source
4

Logcat - Pour vérifier les journaux dans la phase de développement d'Android Studio

Initialement, effacez le Logcat et laissez l'application se bloquer à nouveau afin que vous puissiez obtenir uniquement les détails du journal planté. Vous devez vérifier la trace de la pile

Bien que, malheureusement, MyApp s'est arrêté. Il y a plusieurs raisons à cela. Vous pouvez vérifier la même chose dans les journaux. Pour cela, vous pouvez utiliser Log.e ("TAG", "Message");

Erreur courante lors du plantage de l'application, comme:

  1. Erreur de codage (mauvaise utilisation des mots clés).
  2. Nom de propriété incompatible.
  3. Plugin non pris en charge (peut-être).
  4. Version non compatible (peut-être).
  5. Activité manquante dans le fichier AndroidManifest.
  6. Autorisation manquante dans le fichier AndroidManifest.
  7. NullPointerException le plus courant.
  8. Déclaré mais non défini.

Pour résoudre l'erreur de blocage d'application:

  • Gardez à l'esprit les points ci-dessus et parcourez-les.
  • Avec l'erreur, vous obtiendrez également le nom du fichier en bleu (cliquez dessus et passez au code d'erreur qui se produit).
Ashish
la source
3

Tout d'abord, vous devez vérifier où et pourquoi votre application a planté. (Unfortunately, MyApp has stopped.).À l'aide de LOG, vous pouvez déterminer ce qui n'a pas fonctionné.

Après cela, vous trouvez quel point votre application a arrêté de corriger cela à partir de votre point.

Mehul Solanki
la source
3

Si vous n'avez aucun type de journal intéressant dans votre terminal (ou qu'ils ne sont pas directement liés à votre application), votre problème est peut-être dû à une bibliothèque native. Dans ce cas, vous devez vérifier les fichiers "tombstone" dans votre terminal.

L'emplacement par défaut des fichiers tombstone dépend de chaque appareil, mais si c'est le cas, vous aurez un journal indiquant: Tombstone written to: /data/tombstones/tombstone_06

Pour plus d'informations, consultez https://source.android.com/devices/tech/debug .

zapotèque
la source
0

L'exécution de cette commande dans le terminal peut également aider à trouver le problème:

gradlew build > log.txt 2>details.txt

alors vous devriez aller à l'emplacement du fichier gradlew dans lire les deux fichiers journaux ci-dessus.

Mohsen Emami
la source