2010-09-04 42 views
118

Mam aplikację, która nie jest dostępna na rynku (podpisana za pomocą certyfikatu debugowania), ale chce uzyskać dane dziennika awarii, gdy tylko moja aplikacja ulegnie awarii. Gdzie mogę znaleźć dziennik, dlaczego moja aplikacja uległa awarii?Jak uzyskać dzienniki awarii systemu Android?

+0

[biblioteka Android uchwycić i zgłaszać awarie] (https://github.com/ajitsing/Sherlock) –

Odpowiedz

116

Jeśli Twoja aplikacja jest pobierana przez inne osoby i zawiesza się na zdalnych urządzeniach, możesz zajrzeć do biblioteki raportowania błędów Androida (wymienionej w this SO post). Jeśli jest to tylko na urządzeniu lokalnym, możesz użyć LogCat. Nawet jeśli urządzenie nie było podłączone do komputera hosta po wystąpieniu awarii, podłączenie urządzenia i wydanie polecenia adb logcat spowoduje pobranie całej historii logcat (przynajmniej w takim zakresie że jest zbuforowany, co zwykle jest loooot danych dziennika, to po prostu nie jest nieskończona). Czy któraś z tych opcji odpowiada na twoje pytanie? Jeśli nie, możesz spróbować wyjaśnić, czego szukasz więcej?

+2

możesz szczegółowo opisać, jak korzystać z polecenia adb logcat? Czy uruchamiam to w katalogu/SDK/tools?Czy są jakieś flagi, które powinienem zanotować? itp. –

+2

@ jesses.co.tt Tak, po prostu uruchom 'adb logcat' z katalogu, w którym znajduje się adb. Alternatywnie możesz użyć narzędzi SDK zawartych w wtyczce Eclipse –

+0

OK, wielkie dzięki. –

7

Jeśli używasz platformy Eclipse, upewnij się, że używasz debugowania i nie uruchamiasz. Upewnij się, że jesteś w perspektywie debugowania (u góry po prawej) Być może będziesz musiał kilkakrotnie nacisnąć przycisk "Wznów" (F8), aby wydrukować dziennik. Dziennik awarii będzie w oknie Logcat u dołu - kliknij dwukrotnie, aby wyświetlić pełny ekran, a następnie przewiń do dołu. Zobaczysz czerwony tekst na błędy, ślad katastrofy będzie coś

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 

ważne części do tego jednego są

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) 

te mówią nam, że był tablicą poza granicami wyjątku na na wiersz 13 głównej.java w metodzie onCrate.

+0

+1 ok, to było bardzo głupie ... – UncleZeiv

12

Możesz użyć Apifance. Jest to usługa wieloplatformowa (obecnie głównie Android, iOS z innymi platformami na ich drodze), która pozwala zdalnie debugować dowolne urządzenie mobilne (teraz Android, iOS - inne w fazie rozwoju). To znacznie więcej niż tylko awaria, w rzeczywistości jest to o wiele więcej: logowanie, zgłaszanie problemów przez testerów, crashlog. Integracja trwa około 5 minut. Obecnie możesz poprosić o dostęp do zamkniętej wersji beta.

Nota prawna: Jestem CTO firmy Polidea, firmy odpowiedzialnej za firmę Apphance i jej współtwórcy.

Aktualizacja: Apphance nie jest już zamknięta w wersji beta! Aktualizacja 2: Apphance jest dostępna jako część http://applause.com oferuje

+2

Właśnie wypróbowałem apphance i polubiłem to. Dokumenty pominęły kluczową kwestię podczas integrowania biblioteki apphance z aplikacją; z najnowszą wersją Eclipse ADT, musisz umieścić apphance.jar w katalogu 'libs' jako [this] (http://stackoverflow.com/a/9916751/9648). [To zatwierdzenie github) (https://github.com/johnnylambada/WorldMap/commit/235ac0461a91a080cca2cdcb7fd2059464165406) ​​pokazuje zmiany, które musiałem wprowadzić w mojej aplikacji WorldMap do korzystania z apphance. – JohnnyLambada

+0

@HohnnyLambada Dzięki za komentarz. Zaktualizowaliśmy dokumentację, aby było to bardziej zrozumiałe. –

+12

to nie powinno zawierać tak wielu strzał w górę, że kosztuje 10 razy więcej niż większość budżetów na rozwój (2,500 USD miesięcznie!). – user26676

4

Można użyć Acra z this. Włączając tę ​​bibliotekę do twoich projektów i konfigurując ją, możesz otrzymywać (do wiadomości e-mail lub gdocs) swoje raporty o awariach. Przepraszam za mój zły angielski.

0

Jeśli szukasz dziennika awarii, gdy telefon jest podłączony do komputera, użyj widoku DDMS w Eclipse, a raport znajduje się w LogCat w DDMS, gdy Twoja aplikacja ulega awarii podczas debugowania.

3

Zastosowanie Acra zgłaszania awarii dla Android App ..Acra lib

37

Drogą do tego celu jest implementować interfejs Thread.UncaughtExceptionHandler i przekazać go do Thread.setDefaultUncaughtExceptionHandler() na początku swoją aktywność na onCreate(). Oto klasa implementacji 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); 
    } 
} 

Uwaga Zezwalamy na obsługę domyślnejUEH z Androidem.

Na szczycie swojej działalności zarejestrować wystąpienie powyższej klasy tak:

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

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

Ten uchwyt zapisuje ślad w pliku. Gdy następnym razem uruchomi się ponownie ReaderScope, wykryje plik i wyświetli monit o podanie adresu e-mail dewelopera.

Aby wysłać wiadomość e-mail do śledzenia stosu, wykonaj następujący kod, aby spakować go w wiadomości 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 [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"); 

Albo można też użyć ACRA Raportowanie błędów System.Just Dołącz ACRA.jar bibliotekami w swoim projekcie i używać poniższego fragmentu kodu przed wyrzutni deklaracji klasy aktywność

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

Czy linia domyślnieUEH.uncaughtException (t, e); wywołać metodę uncaughtException() w nieskończoność? –

4

Jeżeli Państwo ponowne szukanie podstawowego narzędzia do zgłaszania awarii, spróbuj crashlytics.

Jeśli chcesz bardziej zaawansowane narzędzie do zgłaszania, skorzystaj z usługi Checkout Gryphonet. Rejestruje wszystkie awarie występujące wraz z dokładną linią kodu, która spowodowała awarię wraz z automatycznymi znacznikami, które pokazują kroki, które użytkownik wykonał przed awarią i więcej.

Powodzenia!

-1

Wypróbuj aplikację Log Carsh z Androidem. Aby pobrać aplikację, użyj aplikacji

.

0

Utworzyłem tę bibliotekę, aby rozwiązać wszystkie problemy. Crash Reporter is a handy tool to capture all your crashes and log them in device locally

Po prostu dodaj tę zależność i jesteś gotowy.

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

Znajdź wszystkie swoje awarie w urządzeniu lokalnie i napraw je w dogodnym dla Ciebie momencie. Awarie są zapisywane przy użyciu łatwego do śledzenia formatu daty i czasu. Dodatkowo zapewnia również API do przechwytywania Logged Exceptions za pomocą poniższej metody.

CrashRepoter.logException(Exception e) 
+0

Jaka jest klasa Java, która służyła do pobierania dzienników awarii urządzenia? – Xenolion

1

Można spróbować tego z konsoli: -

adb logcat -b krach

Powiązane problemy