Java / Android - Как распечатать полную трассировку стека? - PullRequest
116 голосов
/ 20 октября 2011

В 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 ]

138 голосов
/ 20 октября 2011

Следующее должно сделать трюк:

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

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

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

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

112 голосов
/ 20 октября 2011

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

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

9 голосов
/ 02 декабря 2015
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()));
9 голосов
/ 20 октября 2011

Используйте 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.Throwable%29

6 голосов
/ 31 августа 2013

Вы можете использовать это:

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();
}
2 голосов
/ 13 апреля 2018

Вы также можете распечатать трассировку стека в любой точке кода приложения, используя такие методы, как Thread.dumpStack()

Пожалуйста, перейдите по ссылке для подробнее

1 голос
/ 07 февраля 2018

Вам нужно использовать Throwable Object, чтобы получить полную stackTrace.

...