Java / Android-Как распечатать полную трассировку стека?
В Android (Java) как распечатать полную трассировку стека? Если мое приложение вылетает из nullPointerException или что-то еще, оно выводит (почти) полную трассировку стека следующим образом:
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
однако иногда, в целях отладки, я хочу записать полную трассировку стека, где я нахожусь в коде. Я решил, что могу просто сделать это:
StackTraceElement trace = new Exception().getStackTrace();
Log.d("myapp", trace.toString());
но это просто выводит указатель на объект... Нужно ли мне перебирать все элементы трассировки стека для печати они вышли? Или есть простой способ распечатать все это?
7 ответов:
есть переопределения всех методы журнал С
(String tag, String msg, Throwable tr)
подписей.передача исключения как третий параметр должен дать вам полный stacktrace в logcat.
следующее должно сделать трюк:
Log.d("myapp", Log.getStackTraceString(new Exception()));
отметим, что
...x more
в конце не отрезает никакой информации от трассировки стека:(это означает,) что остальная часть трассировки стека для этого исключения соответствует указанному количеству кадров из нижней части трассировки стека исключения, вызванного этим исключением ("заключающее" исключение).
...или другими словами, заменить
x more
последнийx
строки из первого исключения.
Использовать Журнал.getStackTraceString (Throwable t). Вы можете получить более длинные следы стека, копая глубже. Например:
try { ... } catch(Exception e) { Log.d("Some tag", Log.getStackTraceString(e.getCause().getCause())); }
отступил от http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29
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()));
вы можете использовать это:
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(); }
вы также можете распечатать трассировку стека в любой точке кода приложения с помощью таких методов, как
Thread.dumpStack()
пожалуйста, перейдите по ссылке для более подробная информация
вам нужно использовать Throwable объект, чтобы получить полный stackTrace.
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(); }