1. ホーム
  2. java

[解決済み] Java / Android - フルスタックトレースを出力するには?

2022-06-14 02:49:58

質問

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に完全なスタックトレースが表示されるはずです。