web-dev-qa-db-ja.com

ログで切り捨てられるスタックトレースを停止する方法

Javaログで何度もログを取得します。

Caused by: Java.sql.BatchUpdateException: failed batch
    at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.Java:1102)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.Java:514)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.Java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
    ... 113 more

誰もが完全なスタックトレースを表示する方法を知っていますか(つまり、他の113行を表示します)?


JavaDocs(for Java 7) のThrowableには、何が起こっているかについてのかなり詳細な説明があります。

68
SCdF

「... 113 more」が表示される場合、「caused by」例外の残りの行は、親例外のその時点以降の残りの行と同一であることを意味します。

たとえば、あなたは

com.something.XyzException
  at ...
  at ...
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.Java:242)
  at ... <the other 113 lines are here>...
Caused by: <the above>.

AbstractBatcher.executeBatch、242行目で2つのスタックトレースが「一致」し、それ以降、上方向の呼び出しトレースはラッピング例外と同じです。

68
Cowan

Apacheの Commons Lang はNice utilメソッドを提供します ExceptionUtils.printRootCauseStackTrace() はネストされたスタックトレースを「逆さま」で出力します。結果ははるかに直感的です。

PrintStackTrace()メソッドの元の結果の隣に結果が表示された場合、「113 more」行がどこにあるかが明確になります。

20
Hes Siemelink

私は見つけた例が好きです here

_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
_

基本的に、ソースコードでは、mainは_function a_を呼び出し、_function b_は_function e_を呼び出します。 _Function e_はLowLevelExceptionをスローします。これにより、関数cがLowLevelExceptionをキャッチし、MidLevelExceptionをスローします(LowLevelExceptionインスタンス内にMidLevelExceptionインスタンスをラップします。Exceptionクラスには、異なる例外を取り込んでラップできるコンストラクターがあります) 。これにより、関数aがMidLevelExceptionをキャッチし、以前の2つのHighLevelExceptionインスタンスをラップするExceptionをスローします。

他の回答で述べたように、スタックトレースは実際には切り捨てられておらず、完全なスタックトレースが表示されています。私の例の_.. .3 more_は、そうでなければ冗長になるためです。冗長にして出力行を無駄にしたい場合は、_.. 3 more_を次のように置き換えることができます。

_at Junk.b(Junk.Java:17)
at Junk.a(Junk.Java:11)
at Junk.main(Junk.Java:4)
_

しかし、これらの3行はすでに暗示されているため、出力する必要はありません。

13
Kevin Wheeler

増加する -XX:MaxJavaStackTraceDepth JVMオプション。

0

これは全体像を把握するのに役立ちました。例外の完全なスタックトレースを取得しますおよび原因(多くの場合、メインの例外から繰り返し行が表示されますが、役立つ場合があります)。

        ... catch( Exception e) ...

        ... catch( NoClassDefFoundError e)
        {

                for(StackTraceElement ste: e.getStackTrace())
                {
                    System.out.println(ste);
                }

                if( e.getCause()!=null )
                {
                    for(StackTraceElement ste: e.getCause().getStackTrace())
                    {
                        System.out.println(ste);
                    }
                }
        }
0
DAB