2011-07-19 13 views
11

Chciałbym zalogować raporty o błędach mojej aplikacji do konsoli błędów usługi Android Market; wygląda na to, że mogę do tego użyć Log.wtf.W jakich okolicznościach Android Log.wtf zakończy moją aplikację?

Dokumentacja Log.wtf mówi:

Co fatalny Failure: Zgłoś warunek, że nigdy nie powinno się zdarzyć. Błąd będzie zawsze rejestrowany na poziomie ASSERT za pomocą stosu wywołań. W zależności od konfiguracji systemu raport może zostać dodany do DropBoxManager i/lub proces może zostać natychmiast zakończony za pomocą okna dialogowego błędu.

W moim przypadku mogę wychwycić te wyjątki i odzyskać je, wyświetlając komunikat o błędzie; Nie chcę, aby moja aplikacja uległa awarii, ale chcę, aby raport został wysłany do konsoli błędów.

W jakich okolicznościach Log.wtf zakończy moją aplikację? Czy możliwe jest uzyskanie raportu o błędzie bez powodowania awarii aplikacji?

+2

Nie mam bezpośredniej odpowiedzi na Twoje pytanie, ale możesz rozważyć użycie zdalnego śledzenia stosu: http://code.google.com/p/android-remote-stacktrace/ Użyłem go w przeszłość, i to była ogromna pomoc w znalezieniu wszystkich moich błędów. – danh32

Odpowiedz

11

To zależy od ustawień systemowych (niektóre opcje mogą być włączone do debugowania, ale są wyłączone na zwykłych urządzeniach). Są to ustawienia włączone podczas kompilacji Androida dla urządzenia i prawdopodobnie jądra.

Proponuję użyć Log.e() z prefiksem zamiast Log.wtf(), aby uniknąć problemów, np. WTF: Something terrible happened

Oto co się dzieje, kiedy wezwać Log.wtf()

-> Log.java

/** 
* What a Terrible Failure: Report an exception that should never happen. 
* Similar to {@link #wtf(String, Throwable)}, with a message as well. 
* @param tag Used to identify the source of a log message. 
* @param msg The message you would like logged. 
* @param tr An exception to log. May be null. 
*/ 
public static int wtf(String tag, String msg, Throwable tr) { 
    TerribleFailure what = new TerribleFailure(msg, tr); 
    int bytes = println_native(LOG_ID_MAIN, ASSERT, tag, getStackTraceString(tr)); 
    sWtfHandler.onTerribleFailure(tag, what); 
    return bytes; 
} 

-> Log.java

private static TerribleFailureHandler sWtfHandler = new TerribleFailureHandler() { 
     public void onTerribleFailure(String tag, TerribleFailure what) { 
      RuntimeInit.wtf(tag, what); 
     } 
    }; 

-> RuntimeInit. java

/** 
* Report a serious error in the current process. May or may not cause 
* the process to terminate (depends on system settings). 
* 
* @param tag to record with the error 
* @param t exception describing the error site and conditions 
*/ 
public static void wtf(String tag, Throwable t) { 
    try { 
     if (ActivityManagerNative.getDefault() 
       .handleApplicationWtf(mApplicationObject, tag, 
         new ApplicationErrorReport.CrashInfo(t))) { 
      // The Activity Manager has already written us off -- now exit. 
      Process.killProcess(Process.myPid()); 
      System.exit(10); 
     } 
    } catch (Throwable t2) { 
     Slog.e(TAG, "Error reporting WTF", t2); 
    } 
} 

-> ActivityManagerNative.java

public boolean handleApplicationWtf(IBinder app, String tag, 
     ApplicationErrorReport.CrashInfo crashInfo) 
     throws RemoteException { 
    Parcel data = Parcel.obtain(); 
    Parcel reply = Parcel.obtain(); 
    data.writeInterfaceToken(IActivityManager.descriptor); 
    data.writeStrongBinder(app); 
    data.writeString(tag); 
    crashInfo.writeToParcel(data, 0); 
    mRemote.transact(HANDLE_APPLICATION_WTF_TRANSACTION, data, 
      reply, 0); 
    reply.readException(); 
    boolean res = reply.readInt() != 0; 
    reply.recycle(); 
    data.recycle(); 
    return res; 
} 
+0

Gdy czytam ten kod, wygląda na to, że Log.wtf spowoduje awarię aplikacji w zależności od odpowiedzi mRemote. Wygląda na to, że będę musiał mimo wszystko użyć Remote Stacktrace. –

0

Po informacje nebkat. Uwaga na WTF: poziom interfejsu API urządzenia musi wynosić 8 lub więcej.

Powiązane problemy