java - para - manual de programacion android pdf
Java/Android-¿Cómo imprimir un seguimiento de pila completo? (7)
En Android (Java), ¿cómo imprimo un seguimiento de pila completo? Si mi aplicación falla desde nullPointerException o algo así, imprime una traza de pila (casi) completa de la siguiente manera:
java.io.IOException: Attempted read from closed stream.
com.android.music.sync.common.SoftSyncException: java.io.IOException: Attempted read from closed stream.
at com.android.music.sync.google.MusicSyncAdapter.getChangesFromServerAsDom(MusicSyncAdapter.java:545)
at com.android.music.sync.google.MusicSyncAdapter.fetchDataFromServer(MusicSyncAdapter.java:488)
at com.android.music.sync.common.AbstractSyncAdapter.download(AbstractSyncAdapter.java:417)
at com.android.music.sync.common.AbstractSyncAdapter.innerPerformSync(AbstractSyncAdapter.java:313)
at com.android.music.sync.common.AbstractSyncAdapter.onPerformLoggedSync(AbstractSyncAdapter.java:243)
at com.google.android.common.LoggingThreadedSyncAdapter.onPerformSync(LoggingThreadedSyncAdapter.java:33)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:164)
Caused by: java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:148)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:212)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:64)
at android.net.http.AndroidHttpClient.getUngzippedContent(AndroidHttpClient.java:218)
at com.android.music.sync.api.MusicApiClientImpl.createAndExecuteMethod(MusicApiClientImpl.java:312)
at com.android.music.sync.api.MusicApiClientImpl.getItems(MusicApiClientImpl.java:588)
at com.android.music.sync.api.MusicApiClientImpl.getTracks(MusicApiClientImpl.java:638)
at com.android.music.sync.google.MusicSyncAdapter.getChangesFromServerAsDom(MusicSyncAdapter.java:512)
... 6 more
Sin embargo, a veces, para fines de depuración, quiero registrar un seguimiento de pila completo desde donde estoy en el código. Pensé que podría hacer esto:
StackTraceElement trace = new Exception().getStackTrace();
Log.d("myapp", trace.toString());
Pero esto simplemente imprime el puntero al objeto ... ¿Debo iterar a través de todos los elementos traza de la pila para imprimirlos? ¿O hay un método simple para imprimirlo todo?
Hay sustituciones de todos los métodos de registro con las firmas (String tag, String msg, Throwable tr)
.
Pasar una excepción como tercer parámetro debería darle la ruta de pila completa en logcat.
Lo siguiente debería hacer el truco:
Log.d("myapp", Log.getStackTraceString(new Exception()));
Necesitas usar Throwable Object para obtener el stackTrace completo.
try{
// code here
}catch(Exception e){
String exception = getStackTrace(e);
}
public static String getStackTrace(final Throwable throwable) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
return sw.getBuffer().toString();
}
Ref: https://.com/a/18546861
Puedes usar esto:
public static String toString(StackTraceElement[] stackTraceElements) {
if (stackTraceElements == null)
return "";
StringBuilder stringBuilder = new StringBuilder();
for (StackTraceElement element : stackTraceElements)
stringBuilder.append(element.toString()).append("/n");
return stringBuilder.toString();
}
También puede imprimir un seguimiento de pila en cualquier punto del código de su aplicación utilizando métodos como Thread.dumpStack()
Por favor, vaya a través del enlace para más detalles
Use Log.getStackTraceString (Throwable t). Puede obtener trazas de pila más largas cavando más profundo. Por ejemplo:
try {
...
} catch(Exception e) {
Log.d("Some tag", Log.getStackTraceString(e.getCause().getCause()));
}
Retreived from getStackTraceString()
private static String buildStackTraceString(final StackTraceElement[] elements) {
StringBuilder sb = new StringBuilder();
if (elements != null && elements.length > 0) {
for (StackTraceElement element : elements) {
sb.append(element.toString());
}
}
return sb.toString();
}
// call this at your check point
Log.d(TAG, buildStackTraceString(Thread.currentThread().getStackTrace()));