Android

Java / Android - How to print out a full stack trace?

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());

Но это просто выводит указатель на объект... Должен ли я перебирать все элементы трассировки стека, чтобы распечатать их? Или есть простой способ распечатать все это?

Переведено автоматически
Ответ 1

Для этого необходимо выполнить следующее:

Log.d("myapp", Log.getStackTraceString(new Exception()));

Обратите внимание, что ...x more в конце не отсекается никакая информация из трассировки стека:


(Это указывает), что остаток трассировки стека для этого исключения соответствует указанному количеству кадров из нижней части трассировки стека исключения, которое было вызвано этим исключением (исключение "enclosing").


... или, другими словами, замените x more на последние x строки из первого исключения.

Ответ 2

Есть переопределения всех методов журнала с (String tag, String msg, Throwable tr) сигнатурами.

Передача исключения в качестве третьего параметра должна дать вам полную трассировку стека в logcat.

Ответ 3

Используйте Log.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.Бросаемый%29

Ответ 4
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()));
2023-05-20 15:21 java android