Niestety MyApp przestał działać. Jak mogę to rozwiązać?

785

Tworzę aplikację i za każdym razem, gdy ją uruchamiam, pojawia się komunikat:

Niestety MyApp przestał działać.

Co mogę zrobić, aby to rozwiązać?


O tym pytaniu - oczywiście zainspirowanym przez Co to jest ślad stosu i jak mogę go użyć do debugowania błędów aplikacji? , istnieje wiele pytań stwierdzających, że ich aplikacja uległa awarii, bez dalszych szczegółów. To pytanie ma na celu poinstruowanie początkujących programistów Androida, jak samodzielnie rozwiązać problemy lub zadać właściwe pytania.

nhaarman
źródło
22
Widziałem wiele pytań zamykających się w tym duplikacie. Jest to dobre odniesienie do pomocy w publikowaniu odpowiednich danych w pytaniach. Nie jest to jednak duplikat żadnego problemu z rootem, ale tylko metodologia wykopywania problemu z rootem. Myślę, że lepiej byłoby podać link do tego pytania jako odniesienie, a nie zamknąć jako duplikat.
laalto
33
Myślę, że funkcja zamknięcia jest do tego idealna. Większość tych pytań pokazuje niewielką wiedzę na temat podstawowych umiejętności debugowania. Wstrzymanie ich daje im szansę wyjaśnienia problemu przy użyciu metody opisanej w odpowiedzi. Co więcej, mogą samodzielnie rozwiązać problem. Ta dyskusja może być jednak bardziej odpowiednia dla meta.stackoverflow.com.
nhaarman
To pytanie jest zbyt niejasne. Lepszym pytaniem byłoby „za pomocą [myIDE] jak debugować” aplikację na Androida, która wyświetla błąd „Niestety, moja aplikacja się zatrzymała”
Chris Halcrow
7
@ChrisHalcrow To pytanie nie dotyczy w ogóle debugowania. Chodzi o wskazówki dla początkujących w systemie Android, jak radzić sobie z awariami aplikacji.
nhaarman
stackoverflow.com/questions/26609734/ ... .. włącz błąd beide multidexu podczas konwersji na apk
RejoylinLokeshwaran

Odpowiedzi:

717

Ta odpowiedź opisuje proces pobierania śladu stosu. Masz już ślad stosu? Przeczytaj o śladach stosu w „ Co to jest ślad stosu i jak mogę go użyć do debugowania błędów aplikacji?

Problem

Twoja aplikacja RuntimeExceptionzostała zakończona, ponieważ został wyrzucony nieprzechwycony .
Najczęstszym z nich jest NullPointerException.

Jak to rozwiązać?

Za każdym razem, gdy następuje awaria aplikacji Android (lub dowolnej innej aplikacji Java), Stack tracedo konsoli zapisywany jest znak a (w tym przypadku logcat). Ten ślad stosu zawiera istotne informacje do rozwiązania problemu.

Android Studio

Znajdowanie śladu stosu w Android Studio

W dolnym pasku okna kliknij Logcatprzycisk. Możesz też nacisnąć alt+ 6. Upewnij się, że emulator lub urządzenie jest wybrane w Devicespanelu. Następnie spróbuj znaleźć ślad stosu, który jest pokazany na czerwono. W logcat może być zalogowanych wiele rzeczy, więc może być konieczne przewinięcie. Łatwym sposobem na znalezienie śladu stosu jest wyczyszczenie logcat (za pomocą kosza po prawej stronie) i ponowne uruchomienie aplikacji.

Znalazłem ślad stosu, co teraz?

Tak! Jesteś w połowie drogi do rozwiązania problemu.
Musisz tylko dowiedzieć się, co dokładnie spowodowało awarię aplikacji, analizując ślad stosu.

Przeczytaj o śladach stosu w „ Co to jest ślad stosu i jak mogę go użyć do debugowania błędów aplikacji?

Nadal nie mogę rozwiązać mojego problemu!

Jeśli znalazłeś swój Exceptioni linię, w której wystąpił, i nadal nie możesz dowiedzieć się, jak to naprawić, nie wahaj się zadać pytania na StackOverflow.

Staraj się być jak najbardziej zwięzły: opublikuj ślad stosu i odpowiedni kod (np. Kilka linii do linii, która rzuciła Exception).

nhaarman
źródło
33
Wiem, że ten post jest stary: ale jeśli korzystasz z IntelliJ IDEA, możesz wejść do środka Android > Devices|Logcati dodać nowy filtr ( i.imgur.com/145dtkx.png ), i przefiltrować go by Log Messagetutaj, możesz umieścić FATAL EXCEPTION( i.imgur.com/HpELhaU .png ), dzięki czemu w tym polu możesz przeczytać wszystkie Exceptionswyrzucone przez twoją aplikację. Dzięki temu nie musisz wyczyścić logcata i ponownie wykonać awarii. Myślę, że Android Studio też ma tę opcję.
Marco Acierno
1
Filtrowanie logcat w Eclipse można wykonać, wpisując nazwę pakietu Java w polu nazwy aplikacji filtru.
Stephane
Myślę, że głównym celem jest zrozumienie śladu wstecznego, który otrzymujemy, gdy zdarzy się wyjątek. FC są trochę złe, gdy nie ma śladu wstecznego lub nie nadaje się do użytku, czyli tam, gdzie robi się owłosione. ale myślę, że to wyjaśnienie to dobre pierwsze wprowadzenie do znajdowania / identyfikowania takich błędów.
DooMMasteR,
4
Sprawy są łatwe, gdy logcat ma ślad błędu, ale co w przypadku, gdy logcat nie ma nic? stackoverflow.com/questions/32455645/…
Marian Paździoch
4
Problem polega na tym, że wiersz nie zawiera błędu zapisanego i wskazanego przez ślad stosu.
Hilal
115

Można użyć narzędzia ADB Google , aby Logcat fileprzeanalizować problem.

adb logcat > logcat.txt

otwórz logcat.txtplik i wyszukaj nazwę swojej aplikacji. Powinny być informacje o przyczynie niepowodzenia, numer linii, nazwa klasy itp.

Vlad Bezden
źródło
Jest to świetne, pokaże ci szybko wszystko, co dzieje się na urządzeniu, nawet jeśli twój debugger go nie złapie, co może się zdarzyć w przypadku Xamarin, jeśli środowisko wykonawcze nie zostanie załadowane.
jvenema
1
Nie mogłem zrozumieć, dlaczego moja aplikacja uległa awarii w logcat studio Android, nie było żadnych błędów. Ta odpowiedź dała mi to, czego potrzebowałem. Później jednak zdałem sobie sprawę, że miałem włączony filtr w logcat studio, co uniemożliwiało mi zobaczenie błędu. Wróciłem do „Pokaż tylko wybraną aplikację” i wróciłem do działania.
Yannick
powinieneś dodać -d, w przeciwnym razie będziesz musiał przejść do ctrl-C, aby wyjść z logcat. Robięadb logcat -v time -d > filename.txt
Karakuri,
37

Najpierw sprawdzasz, w którym momencie aplikacja się zawiesiła ( Unfortunately, MyApp has stopped.). W tym celu możesz użyć Log.e("TAG", "Message");, korzystając z tego wiersza, możesz zobaczyć, jak aplikacja loguje się do logcat.

Następnie dowiesz się, w którym momencie Twoja aplikacja została zatrzymana, a rozwiązanie tego problemu jest bardzo łatwe.

Hiren Vaghela
źródło
28

Wystarczy sprawdzić błąd w logu cat.

Dostajesz opcję dziennika kota z zaćmienia:

okno-> pokaż widok-> inne-> Android-> Logcat

Log cat zawiera błąd.

W przeciwnym razie możesz również sprawdzić błąd, uruchamiając aplikację w trybie debugowania. Najpierw ustaw punkt przerwania, wykonując:

kliknij prawym przyciskiem myszy projekt-> debuguj jako-> aplikację na Androida

Rahil Ali
źródło
27

Uwaga: w tej odpowiedzi jest używany Android Studio 2.2.2

Uwaga 2: Rozważam, że Twoje urządzenie zostało pomyślnie podłączone.


Pierwszą rzeczą, którą robisz po awarii aplikacji, jest zajrzenie do LogCat, na dole Android Studio znajduje się pasek narzędzi z listą menu:

wizerunek

Kliknij „Android Monitor” (ten, który podkreśliłem na obrazku powyżej.)

Teraz otrzymasz coś takiego:

wizerunek

Zmień „ Verbose” na „ Error”. Teraz będą wyświetlane tylko zarejestrowane błędy. Nie martw się teraz wszystkimi tymi błędami (jeśli je masz).

wizerunek

Ok. Teraz zrób to, co zrobiłeś, aby zawiesić aplikację. Po awarii aplikacji przejdź do logcat. Powinieneś znaleźć nowy dziennik awarii, który ma wiele at:x.x.x: i Caused by: TrumpIsPresidentExceptionna przykład. Przejdź do tego Caused by:oświadczenia w logcat.

wizerunek

Oprócz tego Caused By:powinien istnieć wyjątek. W moim przypadku jest to RuntimeExceptiona pod nim powinna znajdować się linia zawierająca niebieski link, taki jak:

wizerunek

Jeśli toCaused by: NIE MA gdzieś pod nim linii z niebieskim tekstem, poszukaj innej, Caused by:która ma.

Kliknij ten niebieski link . Powinien Cię zabrać tam, gdzie wystąpił problem. W moim przypadku było to spowodowane tym wierszem:

throw new RuntimeException();

Więc teraz wiem, dlaczego się zawiesza. To dlatego, że sam rzucam wyjątek. To był oczywisty błąd .


Powiedzmy jednak, że dostałem kolejny błąd:

java.lang.NullPointerException

Sprawdziłem logcat, kliknąłem niebieski link, który mi dał, i zabrałem mnie tutaj:

mTextView.setText(myString);

Więc teraz chcę debugować. Zgodnie z tym pytaniem StackOverflow NullPointerException mówi, że coś jest null.

Dowiedzmy się, co jest zerowe . Istnieją dwie możliwości. Albo mTextViewjest zerowy, albo myStringjest zerowy. Aby się dowiedzieć, przed mTextView.setText(mString)linią dodaję te dwie linie:

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

Teraz, podobnie jak poprzednio (zmieniliśmy Verose na Error), chcemy zmienić „Error” na „Debug”. Ponieważ logujemy się przez debugowanie. Oto wszystkie metody dziennika:

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

Odkąd użyliśmy Log.d, sprawdzamy w Debugowaniu. Dlatego zmieniliśmy to na debugowanie.

Powiadomienie Log.dma pierwszy parametr, w naszym przypadku „AppDebug”. Kliknij menu „Brak filtrów” w prawym górnym rogu logcat. Wybierz „Edytuj konfigurację filtra”, nadaj nazwę swojemu filtrowi, aw „Log Tag” wpisz „App Debug”. Kliknij OK". Teraz powinieneś zobaczyć dwie linie w logcat:

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

Teraz wiemy, że mTextView ma wartość NULL.

Obserwuję mój kod, teraz coś zauważam.

Mam private TextView mTextViewzadeklarowane na szczycie mojej klasy. Ale nie definiuję tego.

Zasadniczo zapomniałem zrobić to w mojej funkcji onCreate ():

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

Dlatego TO mTextViewjest zero, ponieważ zapomniałem powiedzieć mojej aplikacji, co to jest. Dodam więc ten wiersz, uruchomię aplikację, a teraz aplikacja nie ulega awarii.


Ab ِ
źródło
1
To dobra informacja, ale używanie obrazów Stack Trace zmniejsza ich przydatność - obrazów nie można przeszukiwać, nie można ich kopiować i wklejać, nie można ich odczytać za pomocą czytników ekranu i są trudniejsze do odczytania. (Nawiasem mówiąc, nie głosowałem, po prostu zwracając na to uwagę).
EJoshuaS - Przywróć Monikę
1
@EJoshuaS Nie powiedziałem, żeby dostarczyć obrazy.
Ab
19

To okienko wyskakujące pokazuje się tylko wtedy, gdy w kodzie pojawia się krytyczny wyjątek, który zatrzymuje działanie aplikacji. To może być żadnego wyjątku NullPointerException, OutOfMemoryExceptionetc.

Najlepszym sposobem sprawdzenia jest Logcat, jeśli nadal rozwijasz aplikację w Android Studio, co jest szybkim sposobem na odczytanie śladu stosu i sprawdzenie przyczyny aplikacji.

Jeśli Twoja aplikacja jest już aktywna, nie możesz użyć logcat . W tym celu możesz wdrożyć Crashlyticsraporty o błędach dotyczące każdego wyjątku, który wystąpi.

Ani
źródło
17

Sprawdź swoją Logcatwiadomość i zobacz swój Manifestplik. Powinno być czegoś brakuje, np. Określenie Activity,uprawnień użytkownika itp.

Manoj Ahirwar
źródło
14

Możesz użyć dowolnego z tych narzędzi:

  1. adb logcat

  2. adb logcat> logs.txt (możesz używać edytorów do otwierania i wyszukiwania błędów).

  3. eclipse logcat (jeśli nie jest widoczny w eclipse, przejdź do Windows-> Pokaż widok-> Inne-> Android-> LogCat)

  4. Android Debug Monitor lub Android Device Monitor (wpisz polecenie monitor lub otwórz za pomocą interfejsu użytkownika)

wprowadź opis zdjęcia tutaj

  1. Android Studio

Sugeruję używać Androida Debug Monitor , jest dobry. Ponieważ zaćmienie zawiesza się, gdy jest tam zbyt wiele dzienników, i przez filtr logcat adb i wszystko jest trudne.

Shiv Buyya
źródło
12

Musisz sprawdzić Stack trace

Jak to zrobić?

na swoim IDE Sprawdź okna z LOGCAT

Jeśli nie widzisz okien logcat, przejdź do tej ścieżki i otwórz ją

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

jeśli używasz Google-API, przejdź do tej ścieżki

adb logcat> logcat.txt

Alireza Amini
źródło
10

W poniższej metodzie showToast () musisz przekazać inny parametr kontekstu lub kontekstu aplikacji, abyś mógł spróbować.

  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
źródło
9

Pozwól, że podzielę się podstawową analizą Logcat, gdy napotkasz wymuszenie zamknięcia (gdy aplikacja przestanie działać).

DOCS

Podstawowym narzędziem systemu Android do zbierania / analizowania dzienników jest logcat.

TUTAJ to strona Androida o logcat

Jeśli używasz Androida Studio, możesz również sprawdzić ten LINK .

Przechwytywanie

Zasadniczo możesz RĘCZNIE przechwycić logcat za pomocą następującego polecenia (lub po prostu sprawdź okno AndroidMonitor w AndroidStudio):

adb logcat

Do polecenia można dodać wiele parametrów, które pomagają filtrować i wyświetlać żądaną wiadomość ... To jest sprawa osobista ... Zawsze używam poniższego polecenia, aby uzyskać znacznik czasu wiadomości:

adb logcat -v time

Możesz przekierować dane wyjściowe do pliku i przeanalizować je w edytorze tekstu.

Analizować

Jeśli Twoja aplikacja ulega awarii, otrzymasz coś takiego:

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

Ta część dziennika pokazuje wiele informacji:

  • Kiedy wystąpił problem: 07-09 08:29:13.475

Ważne jest, aby sprawdzić, kiedy wystąpił problem ... W dzienniku może znajdować się kilka błędów ... musisz mieć pewność, że sprawdzasz poprawne komunikaty :)

  • Która aplikacja uległa awarii: com.example.khan.abc

W ten sposób wiesz, która aplikacja uległa awarii (aby mieć pewność, że sprawdzasz dzienniki swojej wiadomości)

  • Który BŁĄD: java.lang.NullPointerException

Błąd wyjątku wskaźnika NULL

  • Szczegółowe informacje o błędzie: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Próbowano wywołać metodę onBackPressed()z FragmentActivityobiektu. Jednak ten obiekt był nullwtedy, gdy to zrobiłeś.

  • Stack Trace: Stack Trace pokazuje kolejność wywoływania metod ... Czasami błąd zdarza się w metodzie wywołującej (a nie w metodzie wywoływanej).

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

Wystąpił błąd w pliku com.example.khan.abc.AudioFragment.java, wewnątrz onClick()metody w linii: 125(stacktrace pokazuje linię, w której wystąpił błąd)

Zostało nazwane przez:

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

Który został nazwany przez:

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

który został nazwany przez:

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

itp....

Przegląd

To był tylko przegląd ... Nie wszystkie dzienniki są proste itp. ... Wystarczy podzielić się pomysłem i dostarczyć podstawowe informacje ...

Mam nadzieję, że mógłbym ci jakoś pomóc ... Pozdrawiam

W0rmH0le
źródło
8

Użyj LogCat i spróbuj znaleźć przyczynę awarii aplikacji.

Aby zobaczyć Logcat, jeśli korzystasz z Android Studio, naciśnij ALT + 6 lub

jeśli używasz Eclipse, to Window -> Open Perspective -> Other - LogCat

Przejdź do LogCat, z rozwijanego menu wybierz błąd. Będzie zawierał wszystkie wymagane informacje, które pomogą ci w debugowaniu. Jeśli to nie pomoże, opublikuj LogCat jako edycję swojego pytania, a ktoś ci pomoże.

Biswajit Karmakar
źródło
7

Jeśli aplikacja z jakiegoś powodu ulega awarii bez dobrego śledzenia stosu. Spróbuj debugować od pierwszej linii i przechodzić linia po linii do awarii. Następnie otrzymasz odpowiedź, która linia powoduje problemy. Prawdopodobnie możesz następnie zapakować go w try catch catch i wydrukować błąd.

felislynx.silae
źródło
5

Ten komunikat o błędzie można również uzyskać samodzielnie, bez żadnych śladów stosu ani żadnego dodatkowego komunikatu o błędzie.

W takim przypadku musisz upewnić się, że manifest Androida jest poprawnie skonfigurowany (w tym wszelkie manifesty łączące się z biblioteki i wszelkie działania pochodzące z biblioteki), a także zwrócić szczególną uwagę na pierwszą aktywność wyświetlaną w aplikacji w plikach manifestu .

Pelpotronic
źródło
3
Byłbym zainteresowany, gdybyś mógł wgrać projekt, który demonstruje to zjawisko.
CommonsWare
5

Awaria podczas programowania

Wypróbuj mój ulubiony widok dziennika narzędzi, aby uzyskać dzienniki i przeanalizować je podczas programowania.
Pamiętaj, aby zaznaczyć ./logviewi ./lib/logview.jarjako wykonywalny podczas działania w systemie Linux.

Jeśli Ci się nie podoba, istnieje wiele alternatywnych przeglądarek dzienników pulpitu dla Androida .

Crash na wolności

Zintegruj narzędzie do raportowania awarii w czasie rzeczywistym, takie jak Firebase Crashlytics , aby uzyskać stosy nieobsługiwanych wyjątków, które wystąpiły na urządzeniach użytkowników.

Przeczytaj, jak wydać Buggy App (i Live to Tell the Tale), aby dowiedzieć się więcej o rozwiązywaniu problemów w terenie.

naXa
źródło
4

Ludzie popełniają błędy, a więc i kodują.

Kiedykolwiek coś errortakiego się zdarzy, zawsze sprawdzaj za pomocą logcat z tekstem w kolorze czerwonym, jednak możesz znaleźć prawdziwy problem w kolorze niebieskim z podkreśleniem w tekście w kolorze czerwonym.

Upewnij się, że jeśli tworzysz nowy activity, zawsze deklaruj activityw AndroidManifestpliku.

Jeśli dodajesz uprawnienia, zadeklaruj je również w AndroidMainifestpliku.

Kopi Bryant
źródło
4

Logcat - Aby sprawdzić dzienniki w fazie rozwoju Android Studio

Najpierw wyczyść Logcat i pozwól aplikacji ponownie się zawiesić, abyś mógł uzyskać tylko szczegółowe dane dziennika awarii. Musisz sprawdzić ślad stosu

Niestety, MyApp przestał działać. Jest wiele powodów. Możesz to samo sprawdzić w logach. W tym celu możesz użyć Log.e („TAG”, „Wiadomość”);

Typowy błąd podczas awarii aplikacji, taki jak:

  1. Błąd kodowania (nieprawidłowe użycie słów kluczowych).
  2. Niedopasowana nazwa właściwości.
  3. Nieobsługiwana wtyczka (być może).
  4. Wersja niedopasowana (być może).
  5. Brak aktywności w pliku AndroidManifest.
  6. Brak uprawnienia w pliku AndroidManifest.
  7. Najczęstszy wyjątek NullPointerException.
  8. Zadeklarowane, ale nie zdefiniowane.

Aby rozwiązać błąd awarii aplikacji:

  • Pamiętaj o punktach powyżej i przejdź przez nie.
  • Wraz z błędem otrzymasz nazwę pliku również w kolorze niebieskim (kliknij na nich i nastąpi przejście do kodu z powodu błędu).
Ashish
źródło
3

Najpierw musisz sprawdzić, gdzie i dlaczego aplikacja się zawiesiła. (Unfortunately, MyApp has stopped.).Za pomocą LOGmożesz dowiedzieć się, co poszło nie tak.

Następnie dowiesz się, w którym punkcie Twoja aplikacja przestała to naprawiać.

Mehul Solanki
źródło
3

Jeśli nie masz żadnego interesującego dziennika w swoim terminalu (lub nie są one bezpośrednio związane z twoją aplikacją), być może twój problem jest spowodowany rodzimą biblioteką. W takim przypadku powinieneś sprawdzić pliki „nagrobka” w swoim terminalu.

Domyślna lokalizacja plików nagrobków zależy od każdego urządzenia, ale w takim przypadku będziesz mieć dziennik z informacją: Tombstone written to: /data/tombstones/tombstone_06

Aby uzyskać więcej informacji, sprawdź https://source.android.com/devices/tech/debug .

zapotec
źródło
0

Również uruchomienie tego polecenia w terminalu może pomóc w znalezieniu problemu:

gradlew build > log.txt 2>details.txt

następnie powinieneś przejść do lokalizacji pliku gradlew w czytaniu dwóch powyższych plików dziennika.

Mohsen Emami
źródło