16

Javaでは、完全な、切り捨てられていないスタックトレースを表示する方法はありますか(たとえば、記録されるフレームの数を増やすことによって)、またはスタックトレースの一番下に表示する方法はありますか?通常、スタックトレースは、1024フレームの価値で上から切り捨てられますが、スタックオーバーフローの問題の場合、再帰をトリガーした呼び出しを誰が行ったかを下の方で確認する必要があるため、これはかなり価値がありません。スタックの途中で切り捨てる方がはるかに優れていますが、SunのJVMはこれを行うのに十分なほど賢くないようです。

おそらく、いくつかの特別な太陽固有のフラグでさえありますか?スタックサイズを最小許容値(-Xss1000)に減らしてみましたが、それでも1024フレーム以上の価値があります。

私の場合、Hadoopマッパーで発生するスタックオーバーフローをデバッグしようとしていますが、これは非常に大きな入力で実行している場合に限られます。問題が発生するのは、再帰操作(ScalaのfoldRight)が非常に大きなリンクリストで実行されているためだと思います。非再帰的に書き直す必要があります...しかし、誰がを呼び出したかを知る必要がありますfoldRight。これは、多くの場所で直接的および間接的に呼び出される基本的なルーチンであり、私が使用しているコードはたくさんあるので、これは非常に明白ではありません。

4

4 に答える 4

25

-XX:MaxJavaStackTraceDepthJVM オプションを試してください。

Stasのブログからの説明です

最大。番号。Java 例外のスタック トレースの行数 (0 はすべてを意味します)。Java > 1.6 では、値 0 は実際には 0 を意味します。すべてのスタックを出力するには、値 -1 または負の数を指定する必要があります (Windows では 1.6.0_22、1.7.0 でテスト済み)。Java <= 1.5 では、値 0 はすべてを意味し、JVM は負の数でチョークします (Windows では 1.5.0_22 でテスト済み)。

于 2012-08-08T20:03:54.800 に答える
2

jstack を使用してみてください。

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/tooldescr.html#gblfh

于 2012-08-08T13:17:10.690 に答える
2

スタック トレースを自分で反復処理できます

Throwable t =

for(StackTraceElement ste: t.getStackTrace()) {
    // is it a repeat??

}

デフォルトの printStackTrace は、記録されたすべてのレベルを出力します。あなたの問題は、スタックがスタック トレースに入れられたものに対して深すぎることです。

スタックサイズを小さくしてみていただけますか?

于 2012-08-08T13:17:36.537 に答える
-1

疑わしいスタック オーバーフローに入る前にコールにアクセスできる場合は、のような追加のスタック トレースを生成できますnew Exception().getStackTracefoldRightそれ自体は無限再帰を生成しないことに注意してください。メモリが不足している可能性があります。JVM のスタック サイズを増やしてみてください。

于 2012-08-08T13:17:52.233 に答える