Как мне остановить усечение стековых трасс в логах? - PullRequest
68 голосов
/ 13 января 2009

Много раз в логах 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 (для Java 7) для Throwable содержат довольно подробное объяснение того, что происходит.

Ответы [ 6 ]

68 голосов
/ 13 января 2009

Когда вы видите «... 113 больше», это означает, что остальные строки исключения «вызвано» идентичны оставшимся строкам с этой точки родительского исключения.

Например, у вас будет

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, а затем с этого момента восходящая трассировка вызова совпадает с исключением обтекания.

20 голосов
/ 13 января 2009

Apache Commons Lang предоставляет хороший метод утилит ExceptionUtils.printRootCauseStackTrace () , который печатает вложенную трассировку стека «вверх ногами». Результат гораздо более интуитивный.

Если вы видите результат рядом с оригиналом из метода printStackTrace (), будет ясно, куда ушли «еще 113» строк.

12 голосов
/ 20 декабря 2014

Мне нравится пример, найденный здесь :

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 и генерировать HighLevelException, который теперь оборачивает два предыдущих экземпляра Exception.

Как отмечалось в других ответах, трассировка стека на самом деле не усекается, вы видите полную трассировку стека. .. .3 more в моем примере есть, потому что в противном случае оно будет избыточным. Если вы хотите использовать избыточные и лишние выходные строки, .. 3 more можно заменить на

at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)

Но нет необходимости выводить эти три строки, потому что они уже подразумеваются.

0 голосов
/ 01 января 2019

Я нашел это полезным, чтобы получить полную картину. Получить полную трассировку стека исключений и причины (которая часто показывает повторяющиеся строки из основного исключения, но может быть полезна).

        ... 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 голосов
/ 02 мая 2018

Увеличение -XX:MaxJavaStackTraceDepth Опция JVM.

0 голосов
/ 19 ноября 2012

В своем блоге я только что описал как получить больше, чем просто «BatchUpdateException: сбой пакета» : установить hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory для отключения пакетирования в спящем режиме Обычно можно использовать BatchUpdateException.getNextException, чтобы выяснить причину сбоя, но в некоторых случаях это может вернуть null. Тогда полезно полностью отключить дозирование.

...