Eclipse日志窗口截断了异常堆栈跟踪

17

我在Eclipse中的Logcat窗口只显示每个异常的前几行StackTrace,这意味着我经常看不到异常发生的位置。是否有任何方法可以更改此设置?


你使用的是哪个SDK版本?这是一种相当奇怪的行为... 请提供一个截断堆栈跟踪输出的示例,谢谢。编辑:我没看到Eclipse标签,抱歉。无论如何,如果你使用原始的logcat,我认为不会有问题:adb logcat - Cristian
如果你指的是"...12 more lines..."部分,那只有在异常是由另一个异常引起时才会看到它。如果堆栈跟踪的顶部部分与另一个相同,则仅为其中一个显示完整的帧集合,而另一个则使用"..."处理。(你真的需要在你的问题中添加更多的细节——我们只是猜测你想要什么。) - fadden
@Fadden:你说得对 - 它根本没有截断。如果你将这条评论作为答案发布,我会接受的。 - Casebash
3个回答

32

如果你指的是"...12 more lines..."部分,那么这只会出现在异常是其他异常的原因时。如果顶部的堆栈跟踪与早期的跟踪相同,则全套框架仅对最外层异常显示,而其他跟踪则会得到"..."处理。

换句话说,未显示的跟踪块是之前在异常原因链中出现过的一个跟踪的副本。例如,假设我有一段代码,其中方法main()调用one(),后者调用two(),依此类推。four()抛出一个异常。two()捕获并重新抛出它。异常将如下所示:

java.lang.RuntimeException: re-throw
    at Foo.two(Foo.java:14)
    at Foo.one(Foo.java:7)
    at Foo.main(Foo.java:3)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: first
    at Foo.four(Foo.java:23)
    at Foo.three(Foo.java:19)
    at Foo.two(Foo.java:12)
    ... 3 more
“由...引起”的异常信息中说了“...3 more”,而不是明确列出one()main()dalvik.system.NativeStart.main。因此,要获取初始异常的完整跟踪记录,您需要从其跟踪记录开始阅读,然后继续查看上方的跟踪记录。
请注意,两者之间没有重叠-two()在两者中都出现,但在“第一”跟踪记录中,它在调用three()时,而在“重新抛出”跟踪记录中,它在throw指令上。

那么,如果原始异常是您想要查看超过7行的异常,该怎么办呢? - George
我重新撰写了解释并添加了一个例子。 - fadden
1
是的,我已经有一段时间没有使用“真正的”Java了,但是我应该通过搜索“Java stacktrace 12 more”或类似的内容来解决这个问题。正如你所指出的那样,“12 more”(已编辑)行是来自上面堆栈跟踪的重复行。我曾经认为LogCat正在修剪堆栈跟踪的“有用”行,但事实并非如此。感谢您纠正我的误解。 - George

1

-1

如果您的代码调用了一个产生了太多堆栈的方法,您可以(而且应该)在您的代码中处理异常,并输出与日志相关的内容。

如果您完全没有异常处理,甚至不知道在代码中应该放置这样的处理程序,那么问题完全在其他地方 - 您应该更好地处理异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接