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.(GZIPInputStream.java:81) at java.util.zip.GZIPInputStream.(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());
Но это просто печатает указатель на объект … Нужно ли мне перебирать все элементы трассировки стека, чтобы распечатать их? Или есть простой способ распечатать все это?
- java.util.ConcurrentModificationException при добавлении другого объекта
- Почему double width = 50/110000; выход составляет 0,000000000000000?
- Переопределить цвета контекстного меню в Android
- Переменные среды для установки Java
- Как избежать избыточности кода конструктора в Java?
- Как преобразовать из int в String?
- Android AutoCompleteTextView с чипами
- Действительно ли невозможно защитить приложения Android от обратного проектирования?
- Android: как отображать предварительный просмотр камеры с помощью обратного вызова?
- Добавить ярлык для приложения для Android. На главный экран.
- Показывать только две цифры после десятичной
- АБР по беспроводной сети
- Jar Mismatch Нашел 2 версии android-support-v4.jar в списке зависимостей
Есть переопределения всех методов журнала с (String tag, String msg, Throwable tr)
подписи (String tag, String msg, Throwable tr)
.
Передача исключения в качестве третьего параметра должна дать вам полный стек в logcat.
Следующее должно сделать трюк:
Log.d("myapp", Log.getStackTraceString(new Exception()));
Обратите внимание, что ...x more
в конце не отключает никакой информации из трассировки стека:
(Это указывает), что оставшаяся часть трассировки стека для этого исключения совпадает с указанным числом кадров из нижней части трассировки стека исключения, вызванного этим исключением (исключение «охватывающего»).
… или, другими словами, заменить x more
на последние строки x
из первого исключения.
Используйте Log.getStackTraceString (Throwable t). Вы можете получить более длинные трассировки стека, копая глубже. Например:
try { ... } catch(Exception e) { Log.d("Some tag", Log.getStackTraceString(e.getCause().getCause())); }
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 Object.
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(); }