Javaスタックトレースダンプの表示行数を増やすにはどうすればよいですか?


回答:


122

する必要はありません。その情報はスタックトレースの他の場所にあります。のドキュメントからprintStackTrace()

文字を含む行の存在に注意してください"..."。これらの行は、この例外のスタックトレースの残りの部分が、この例外(「囲んでいる」例外)によって引き起こされた例外のスタックトレースの下部から指定されたフレーム数と一致することを示しています。

この短縮形は、「原因となる例外」がキャッチされたのと同じメソッドからラップされた例外がスローされる一般的なケースで、出力の長さを大幅に削減できます。

つまり、は"... x more"チェーン例外にのみ表示されx、スタックトレースの最後の行がすでに別のチェーン例外のスタックトレースの一部として存在している場合に限られます。

メソッドが例外Fooをキャッチし、それを例外Barにラップして、Barをスローするとします。その後、Fooのスタックトレースが短縮されます。なんらかの理由で完全なトレースが必要な場合は...、Fooのスタックトレースの前の最後の行を取得して、Barのスタックトレースでそれを探すだけです。その行の下にあるものはすべて、Fooのスタックトレースに出力されたものとまったく同じです。


最後の段落は誤解を招くものです。前の行...は異なる最初のフレームです。しかし、それはそれを見つけるのに役立つ少なくとも同じクラスになります。
Marcono1234

5

あなたのための方法を簡単に推測してください。

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

2

Throwable.printStackTrace()のドキュメントからスタックトレースを取得してみましょう。

HighLevelException: MidLevelException: LowLevelException
    at Junk.a(Junk.java:13)
    at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
    at Junk.c(Junk.java:23)
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    ... 1 more
Caused by: LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    ... 3 more

原因は、一番下にある最もネストされたもの(「根本原因」)から、印刷されたスタックトレースが属するものまで表示されます。

この場合、根本的な原因はLowLevelException、それが原因MidLevelExceptionであり、それが原因HighLevelExceptionでした。

完全なスタックトレースを取得するには、囲んでいる例外(および囲んでいる例外)のフレームを調べる必要があります。

  1. 省略されたフレームの数を見てください: "... X more"
  2. 囲んでいる例外で省略されたフレームを探します
    1. 省略されたフレームの数を見てください: "... Y more"
    2. 最初のX-Yフレームをスタックトレースに追加する
  3. Y> 0の場合、省略されたフレームの数としてステップ2を繰り返します。

したがって、完全なスタックトレースを取得LowLevelExceptionするには、次のようにします。

  1. 省略されたフレームの数を見てください:「...あと3つ」
  2. 囲んでいる例外(MidLevelException) で省略されたフレームを探します。
    1. 1フレームが省略されています( "... 1 more")
    2. 最初の2(3-1)フレームをスタックトレースに追加する
  3. 省略されたフレームの数を1として、ステップ2を繰り返します。
    1. MidLevelExceptionHighLevelException)の囲み例外を見てください。
    2. 最初の1フレームをスタックトレースに追加する

完全なスタックトレースは次のようになります。

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

サイドノート:

  • フレームがリストされていない場合があります。例:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more

    これは、原因が同じ行に作成された場合に発生する可能性がありますnew HighLevelException(new MidLevelException())。これで混乱しないでください。上記のアプローチは引き続き機能します。例外から使用するフレームがないので、囲んでいるフレームを続行します。

  • 場合によっては、省略されていない最初のフレーム(上記の行... X more)を確認することで、カウントを節約できます。その行でメソッドを呼び出すメソッドがわかっている場合は、囲んでいる例外のフレームで呼び出し元を直接検索できます。

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.