提问人:Luchian Grigore 提问时间:9/29/2011 更新时间:9/7/2021 访问量:67741
如何在eclipse上显示全栈跟踪?
How to show full stack trace on 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
答:
您拥有整个堆栈。
这只是堆栈跟踪的一部分。紧接着是另一件作品。看看这个的底线,以及上一个的顶线。你会看到他们匹配。堆栈跟踪以不以“Caused by”开头的部分开始。
“Caused by”异常隐藏了堆栈跟踪的部分,这些部分在其父级中是堆栈跟踪条目的逐字副本。换句话说,Java 不会显示整个堆栈,直到 main() 的所有原因 - 它只是显示你还没有看到的内容。请参阅 Throwable.printStackTrace() 文档。
当您在创建 Throwable 时提供原因时,将填充“Caused by”。查看它的构造函数。当一段代码捕获到低级异常,然后想要将其作为不同的异常类重新抛出时,就会完成此操作。
评论
正如 Ed 所说,它显示了整个堆栈,但遗漏了您已经看到的信息。参见 Throwable#printStackTrace()
从那里引用:
请注意,存在包含字符“...”的行。这些 行表示堆栈跟踪的其余部分 异常与从底部开始指示的帧数匹配 由此异常导致的异常的堆栈跟踪 (“封闭”例外)。这种速记可以大大减少 在包装异常为 从与捕获“因果异常”相同的方法抛出
通常,异常会被包装;创建时有另一个异常作为原因:
try {
// something which causes an Exception
} catch (Exception e) {
throw new SpecificException("help", e);
}
在这种情况下,显示堆栈跟踪将创建...你看到的还有 11 个。
我从未见过,但试试这个
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());
}
}
}
我认为这意味着在被调用之前被捕获并包装成另外 11 次。Exception
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");
}
}
上面的答案并不准确,每次堆栈显示“引起”字样时,都意味着异常经过了一种或多种方法,直到被捕获,然后再次抛出。这种情况可能会发生很多很多次,堆栈跟踪不是一个循环,它是一个单一的方向,所以不,顶部的东西与底部的东西无关,最重要的部分是底部,这是异常的根源,所以如果你有:
类 main 中的异常:等等等等等等 ...代码行... 由 FileNotFoundException 引起 ...代码行... 原因:MalformedURLException ...代码行... 原因:NullPointerException
那么,您就不想过多地关注 FileNotFoundException,而是希望更多地关注 NullPointerException。比如说你有一个属性文件,里面有一个文件名。如果不小心使用了 mykey,以查找属性“myKey”,则 propertiesResource 将返回一个 null,然后该 null 将通过所有代码行(希望)一直抛到最后一个 catch 块所在的应用程序。 .但是,在这个 piont 中,它不会被“包装”为 nullException,而是作为 FileNotFoundException。 .
我们可能偏离了他面临的实际问题。我遇到了类似的问题,结果发现我选中了我的限制控制台。删除它后,我能够看到完整的堆栈跟踪。 步骤: 右键单击控制台 ||Ctrl + 单击 Mac 转到首选项并按照上述说明进行操作
评论
有一个 vmargs 选项
-XX:-OmitStackTraceInFastThrow
这在某些情况下可能会有所帮助。
为了简化公认的答案,让我们考虑一个简单的符号。
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();
}
评论