如何在eclipse上显示全栈跟踪?

How to show full stack trace on eclipse?

提问人:Luchian Grigore 提问时间:9/29/2011 更新时间:9/7/2021 访问量:67741

问:

我正在使用 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

Java Eclipse

评论

2赞 cdeszaq 9/29/2011
Eclipse 控制台窗口应显示整个异常。此跟踪打印在哪里?在处理 Web 应用程序时,我在浏览器中看到过这样的有限跟踪,但在控制台中从未看到过有限的跟踪。
0赞 Luchian Grigore 9/29/2011
我不知道,这就是我想要找出的。问题是我的断点没有被激活,所以我无法找到确切的位置。
0赞 cdeszaq 9/29/2011
你是什么意思?我要问的是“你在哪里看到的”?它是在 Eclipse IDE 界面的一部分(特别是控制台)中,还是显示在其他窗口或文件中?
0赞 Luchian Grigore 9/29/2011
哦,是eclipse控制台。我以为你的意思是printStackTrace()调用在哪里......

答:

33赞 Ed Staub 9/29/2011 #1

拥有整个堆栈。

这只是堆栈跟踪的一部分。紧接着是另一件作品。看看这个的底线,以及上一个的顶线。你会看到他们匹配。堆栈跟踪以不以“Caused by”开头的部分开始。

“Caused by”异常隐藏了堆栈跟踪的部分,这些部分在其父级中是堆栈跟踪条目的逐字副本。换句话说,Java 不会显示整个堆栈,直到 main() 的所有原因 - 它只是显示你还没有看到的内容。请参阅 Throwable.printStackTrace() 文档

当您在创建 Throwable 时提供原因时,将填充“Caused by”。查看它的构造函数。当一段代码捕获到低级异常,然后想要将其作为不同的异常类重新抛出时,就会完成此操作。

评论

3赞 Ed Staub 9/29/2011
@Luchian - 这只是堆栈跟踪的一部分。紧接着是另一件作品。看看这个的底线,以及上一个的顶线。你会看到他们匹配。堆栈跟踪以不以“Caused by”开头的部分开始
1赞 Luchian Grigore 9/29/2011
右。。。好吧,所以我想我被困住了。我想早点发现异常。问题是,我设置了一个断点,以明确抛出异常但未触发......
11赞 Robin 9/29/2011
@LuchianGrigore - 您可以为特定异常设置断点,而不是一行代码。在调试透视图的“断点”选项卡中,有一个带有“J!”的按钮。按下它!
1赞 Matthew Farwell 9/29/2011 #2

正如 Ed 所说,它显示了整个堆栈,但遗漏了您已经看到的信息。参见 Throwable#printStackTrace()

从那里引用:

请注意,存在包含字符“...”的行。这些 行表示堆栈跟踪的其余部分 异常与从底部开始指示的帧数匹配 由此异常导致的异常的堆栈跟踪 (“封闭”例外)。这种速记可以大大减少 在包装异常为 从与捕获“因果异常”相同的方法抛出

通常,异常会被包装;创建时有另一个异常作为原因:

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

在这种情况下,显示堆栈跟踪将创建...你看到的还有 11 个。

1赞 Ramzi Khahil 9/29/2011 #3

我从未见过,但试试这个

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());
     }
  }
}
2赞 Miserable Variable 9/29/2011 #4

我认为这意味着在被调用之前被捕获并包装成另外 11 次。ExceptionprintStackTrace

尝试找出以下程序的输出,以便更好地理解:

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

}
9赞 bill 7/30/2012 #5

上面的答案并不准确,每次堆栈显示“引起”字样时,都意味着异常经过了一种或多种方法,直到被捕获,然后再次抛出。这种情况可能会发生很多很多次,堆栈跟踪不是一个循环,它是一个单一的方向,所以不,顶部的东西与底部的东西无关,最重要的部分是底部,这是异常的根源,所以如果你有:

类 main 中的异常:等等等等等等 ...代码行... 由 FileNotFoundException 引起 ...代码行... 原因:MalformedURLException ...代码行... 原因:NullPointerException

那么,您就不想过多地关注 FileNotFoundException,而是希望更多地关注 NullPointerException。比如说你有一个属性文件,里面有一个文件名。如果不小心使用了 mykey,以查找属性“myKey”,则 propertiesResource 将返回一个 null,然后该 null 将通过所有代码行(希望)一直抛到最后一个 catch 块所在的应用程序。 .但是,在这个 piont 中,它不会被“包装”为 nullException,而是作为 FileNotFoundException。 .

6赞 shashwatZing 9/3/2015 #6

enter image description here

我们可能偏离了他面临的实际问题。我遇到了类似的问题,结果发现我选中了我的限制控制台。删除它后,我能够看到完整的堆栈跟踪。 步骤: 右键单击控制台 ||Ctrl + 单击 Mac 转到首选项并按照上述说明进行操作

评论

1赞 Luchian Grigore 9/3/2015
不知道我们分歧有多大,已经 4 年:)不再面临这个问题......
0赞 shashwatZing 9/4/2015
哈哈。我实际上面临着这个问题。所以把它放在那里,这样其他人就不会在Eclipse中没有看到完整的堆栈跟踪时分心。很长一段时间的四年。
0赞 Martin 2/24/2018 #7

有一个 vmargs 选项

 -XX:-OmitStackTraceInFastThrow

这在某些情况下可能会有所帮助。

0赞 Imran khan 9/7/2021 #8

为了简化公认的答案,让我们考虑一个简单的符号。

    Exception in main ……           
    At A                                              
    At B                                 
    At C                        
                        
    Caused by ….                                    
    AT P                                    
    At Q                              
    AT R                               
    AT A    - >  { THIS ONE IS REPEATED ,  But slightly with line 
    number changes   }                  .
    MISSING 2 MORE  { THOSE 2 ARE NOTHING BUT B AND C .}

    Caused by …                          
    At X                               
    At Y                                
    At P     - >  { THIS ONE IS REPEATED ,  But slightly line 
    number changes   } 
    Missing 5 More ( Those 5 are nothing but Q,R, ,A,B,C ) 

因此,您拥有整个堆栈。

但请确保在eclipse首选项的run/debug下拉-->控制台下未选中“limit console output”复选框。

您可以使用以下代码来获得更清晰的信息。

    try {
    // code causing exception 
    }
    
    catch(Exception ex){                        
        Throwable exThrowable=ex;
        
        while(exThrowable!=null) {
            System.out.println(exThrowable);
            StackTraceElement[] arr = 
             exThrowable.getStackTrace();
             for(int i=0; i<arr.length; i++){
               System.out.println(arr[i].toString());
             }
             exThrowable=exThrowable.getCause();
        }