В 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());
Но при этом просто выводится указатель на объект ... Нужно ли мне перебирать все элементы трассировки стека, чтобы распечатать их? Или есть простой способ все это распечатать?
Ответы:
Есть переопределения всех методов журнала с
(String tag, String msg, Throwable tr)
подписями.Передача исключения в качестве третьего параметра должна дать вам полную трассировку стека в logcat.
источник
getStackTraceString()
метод, упомянутый @Thomas за кулисами.Следующее должно помочь:
Обратите внимание, что
...x more
в конце не обрезается никакой информации из трассировки стека:... или, другими словами, заменить
x more
на последниеx
строки из первого исключения.источник
getStackTraceString()
? Не отображается в Eclipse? Это не частьThrowable
илиException
....import android.util.Log;
).Используйте Log.getStackTraceString (Throwable t). Вы можете получить более длинные следы стека, копнув глубже. Например:
Получено с http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29
источник
Log.getStackTraceString()
не регистрирует трассировку стека, а просто возвращает ее как String. Приведенный выше код ничего не регистрирует, а также не сработает с NPE, еслиe.getCause()
естьnull
.источник
Вы можете использовать это:
источник
Вы также можете распечатать трассировку стека в любой точке кода приложения, используя такие методы, как
Thread.dumpStack()
Пожалуйста, пройдите по ссылке, чтобы узнать больше
источник
Вам нужно использовать Throwable Object, чтобы получить полный stackTrace.
Ссылка: https://stackoverflow.com/a/18546861
источник
Я быстро сделал рекурсивную функцию, которая будет повторять throwable и throwable.getCause ().
Это потому, что каждый "throwable.getCause ()" возвращает вам новое сообщение об исключении с повторением некоторых строк и новыми строками. Итак, концепция такова: если есть "причина", в главном файле throwable есть строка с "n more ..", поэтому я получаю последнюю строку перед строкой с "n more ..", тогда я получаю сообщение о причине и наконец, я делаю подстроку сообщения о причине, получая только часть после последней повторяющейся строки (последняя строка, которая появляется на обоих: основной объект throwable и объект throwable причины).
Затем я использую рекурсию, когда получаю сообщение о причине, поэтому повторно вызывая ту же функцию, чтобы получить сообщение о причине из основного объекта throw, я получаю уже замененное сообщение. Если причина, вызываемая из основного объекта throwable, имеет также другую причину, поэтому основной объект throwable имеет 3 уровня (main -> cause -> cause-of-cause), на основном throwable я получу "сообщение причины" уже замененное сообщение. (используя ту же концепцию основного
Я пробовал только 2 уровня (основной -> причина) и не более: / Если что-то не так, отредактируйте функцию и напишите комментарий: D
Удачного кодирования и хорошего дня: D
Важный:
В этом коде иногда возникает исключение, если "st" не содержит "\ n" и т.п. (я обнаружил, что некоторые исключения имеют эту проблему в трассировках стека). Чтобы решить эту проблему, вам нужно добавить некоторую проверку перед строкой кода: "String r1 = ..."
Вам необходимо проверить: «st» содержит «\ n» и что оба начального и конечного индексов «st.subSequence» действительны.
В любом случае я предлагаю поместить это в try-catch и вернуть пустую строку в случае исключения. (Это рекурсивно, поэтому возвращенная пустая строка будет объединена с предыдущей обработанной строкой).
источник