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

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

Есть переопределения всех методов журнала с (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())); } 

Получен от 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 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(); } 

Ссылка: https://stackoverflow.com/a/18546861

  • Консоль Netbeans не отображает символы юникода Bangla
  • Как десериализировать подclass в Firebase, используя getValue (Subclass.class)
  • Firestore - объект с внутренним объектом
  • Может ли основной метод в Java возвращать что-то?
  • Openssl не распознается как внутренняя или внешняя команда
  • Android - Как сделать скриншот программным
  • Как создать свою собственную библиотеку для разработки Android, которая будет использоваться в каждой написанной вами программе?
  • android: clickable = "true" означает, что он не доступен для кликов?
  • Безопасная публикация HTTP на Android
  • Невозможно получить информацию о подписке из API разработчика Google Play для Android
  • Ошибка MediaPlayer -38,0
  • Interesting Posts

    Получение последнего аргумента, переданного сценарию оболочки

    Каким детерминированным является неточность с плавающей запятой?

    Я хочу переименовать один текст для массовых файлов в папку в Windows 7

    Большая копия Win7 x64 Ошибка создания файла – Срок таймаута семафора истек

    Предотвращение спящего режима ПК Windows 7 во время загрузки

    dplyr – mutate: использовать имена динамических переменных

    Генерация перетасованного диапазона с использованием PRNG, а не перетасовка

    Выражение ___ изменилось после проверки

    Есть ли определенный флаг компилятора Xcode, который устанавливается при компиляции для iPad?

    Как преобразовать строки в и из массивов байтов UTF8 в Java

    Как у меня нет веб-браузера по умолчанию, поэтому система спрашивает, какой браузер использовать, когда я нажимаю ссылку?

    Rails 4: организовать модели рельсов в подпути без шаблонов имен?

    Как синхронизировать сохраненные разговоры Skype между машинами?

    Есть ли способ использовать GeoFire с Firestore?

    Можно ли отключить административные ресурсы в Windows 7?

    Давайте будем гением компьютера.