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

但这只是打印出指向对象的指针……我是否必须遍历所有堆栈跟踪元素才能打印出来?或者有什么简单的方法可以全部打印出来吗?

原文由 Jake Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 797
2 个回答

覆盖所有带有 (String tag, String msg, Throwable tr) 签名的 日志方法

将异常作为 第三个 参数传递应该会为您提供 logcat 中的完整堆栈跟踪。

原文由 Philipp Reichart 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下应该可以解决问题:

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

请注意,最后的 ...x more 不会切断堆栈跟踪中的任何信息:

(这表明) 此异常的堆栈跟踪的其余部分与由此异常(“封闭”异常)引起的异常堆栈跟踪底部的指定帧数相匹配。

…或者换句话说,将 x more 替换为第一个异常中的最后 x 行。

原文由 Michael Berry 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题