Подтвердить что ты не робот

Как показать полную трассировку стека на eclipse?

Я использую Eclipse для отладки приложения Java. Где-то в коде я получаю исключение и трассировку стека:

Caused by: java.io.EOFException: The connection has been reset while reading the header
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.fetchHeader(Message.java:583)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:599)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.read(Message.java:542)
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1029)
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:158)
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363)
    at com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:229)
    at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321)
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646)
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108)
    ... 11 more

Как получить весь стек вместо ... 11 more?

4b9b3361

Ответ 1

У вас есть весь стек.

Это только часть трассировки стека. Непосредственно перед этим была еще одна штука. Посмотрите на нижние строки этого и верхние строки предыдущего. Вы увидите, что они совпадают. Трассировка стека начинается с раздела, который не начинается с "Caused by".

Исключением "Caused by" является скрытие частей трассировки стека, которые являются дословными копиями записей трассировки стека в родительском элементе. Другими словами, Java не показывает весь стек до main() для каждой причины - он просто показывает то, что вы еще не видели. См. Документацию Throwable.printStackTrace().

"Причиненный" заполняется, когда вы указываете причину при создании Throwable. Посмотрите на конструкторы для него. Это делается, когда кусок кода ловит исключение низкого уровня, а затем хочет реконструировать его как другой класс исключений.

Ответ 2

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

Исключение в классе main: blah blah blah ... строки кода... вызванное FileNotFoundException ... строки кода... вызвано: MalformedURLException ... строки кода... вызванное: NullPointerException

то вы не хотели бы так много фокусироваться на FileNotFoundException, но вам хотелось бы больше сосредоточиться на исключении NullPointerException. Например, у вас есть файл свойств с именем файла в нем. Если случайно использовать mykey, чтобы найти свойство "myKey", свойство propertiesResource вернет значение null, которое затем будет пропущено через все строки кода (надеюсь) в ваше приложение, где находится последний блок catch., который в этом piont был бы "завернут" не как nullException, а как исключение FileNotFoundException.,

Ответ 3

введите описание изображения здесь

Мы можем расходиться с реальной проблемой, с которой он сталкивается. У меня была схожая проблема, и оказалось, что у меня установлен флажок "Ограниченная консоль". После того, как я удалил его, я смог увидеть полный стек. шаги: Щелкните правой кнопкой мыши на консоли || ctrl + click, если mac перейдите к настройкам и следуйте приведенным выше инструкциям.

Ответ 4

Я думаю, это означает, что Exception был пойман и упакован в другой 11 раз до того, как был вызван printStackTrace.

Попробуйте и выясните результат следующей программы для лучшего понимания:

public class PrintStackTrace {

    public static void main(String[] args) {
        try {
            level1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            level2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    static void level2() throws Exception {
        try {
            level1();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    static void level1() throws Exception {
        try {
            throwingMethod();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    static void throwingMethod() throws Exception {
        throw new Exception("throwingMethod");
    }

}

Ответ 5

Как говорит Эд, он показывает весь стек, но не оставляет информации, которую вы уже видели. См. Throwable # printStackTrace()

Цитата оттуда:

Обратите внимание на наличие строк, содержащих символы "...". Эти строки показывают, что оставшаяся часть трассировки стека для этого исключение соответствует указанному числу кадров со дна трассировка стека исключения, вызванного этим исключением (исключение "закрытие" ). Это сокращение может значительно уменьшить длина вывода в общем случае, когда обернутое исключение выбрасывается из того же метода, что и "причинное исключение".

Часто исключение заверяется; созданный с другим исключением в качестве причины:

try {
    // something which causes an Exception
} catch (Exception e) {
    throw new SpecificException("help", e);
}

В этом случае отображение stacktrace создаст... еще 11, которые вы видите.

Ответ 6

Я этого никогда не видел, но попробуйте это

public void problemFunction(){
  try{
      //your code
  catch(Exception ex){
     ex.printStackTrace();
  }
}

или

public void problemFunction(){
  try{
      //your code
     }
  catch(Exception ex){
     System.out.println(ex);
     StackTraceElement[] arr = ex.getStackTrace();
     for(int i=0; i<arr.length; i++){
       System.out.println(arr[i].toString());
     }
  }
}