Как остановить усечение трассировки стека в журналах

Часто в журналах 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 есть довольно подробное объяснение того, что происходит.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
73
0
32 662
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Какие? Причина такая же, как и исключение упаковки? Я не понял ... Couse должен показать строку, в которой проблема, что она не показывает при усечении трассировки стека. У меня возникла эта проблема, и я хотел бы понять этот ответ, если бы кто-то мог его переформулировать ... Спасибо! Кстати, этот ответ, похоже, не показывает, как распечатать полную трассировку стека.

The Student 01.06.2010 22:55

@TomBrito вы видите полную трассировку стека - у вас есть два исключения, одно внутри другого. Если трассировка стека внутреннего (обернутого) исключения - это ABCDEFG, а трассировка стека внешнего исключения - это ABCZ, тогда вы увидите OuterException с трассировкой стека ZCBA, "вызванное" InnerException с трассировкой стека "GFEDC ... ' потом еще 2 '". Еще 2 - это A и B из внешней трассировки стека, и они для краткости опущены.

Cowan 02.06.2010 03:14

Это неверный ответ. Я абсолютно сталкивался с ситуациями, когда оставшиеся строки НЕ идентичны. В этой ситуации решением было увеличить максимальную глубину трассировки стека, как указывает Никита Кокшаров ниже, с помощью параметра виртуальной машины -XX: MaxJavaStackTraceDepth.

senfo 12.06.2019 16:20

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

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

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

Это не отвечает на вопрос. Это может решить его ситуацию в реальной жизни, поэтому добавление его в качестве комментария к его вопросу может быть более полезным, чем публикация ответа.

Alexander Bird 10.01.2018 23:42

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

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)

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

Увеличьте опцию -XX:MaxJavaStackTraceDepth JVM.

Почему за это отказывают? Это и есть ответ. Установите -1 для неограниченной глубины.

senfo 12.06.2019 16:17

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

        ... 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);
                    }
                }
        }

Другие вопросы по теме