如何增加Java堆栈跟踪转储的显示行数?


Answers:


122

您不需要 该信息存在于堆栈跟踪中的其他位置。来自的文档printStackTrace()

注意包含字符的行 "..."。这些行指示此异常的堆栈跟踪的其余部分与由该异常(“封闭”异常)引起的异常的堆栈跟踪的底部指示的帧数匹配。

在从捕获“引起性异常”的相同方法引发包装异常的常见情况下,该速记可以大大缩短输出的长度。

换句话说,"... x more"唯一出现在链接的异常上,并且仅当x堆栈跟踪的最后几行已作为另一个链接的异常的堆栈跟踪的一部分出现时。

假设方法捕获到异常Foo,将其包装在异常Bar中,然后抛出Bar。然后,Foo的堆栈跟踪将被缩短。如果出于某种原因想要完整的跟踪,则只需...在Foo的堆栈跟踪中获取最后一行,然后在Bar的堆栈跟踪中查找;该行下方的所有内容恰好是Foo的堆栈跟踪中所打印的内容。


最后一段是误导性的。不会有任何重叠,第一行...是不同的。但是,它将至少在同一类中,这有助于查找它。
Marcono1234 '19

5

快速为您找到一种方法。

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

2

让我们从Throwable.printStackTrace()的文档中获取堆栈跟踪:

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

原因从最底部的嵌套原因(“根本原因”)显示到打印堆栈跟踪所属的原因。

在这种情况下,根本原因是LowLevelException,哪个原因MidLevelException,哪个原因HighLevelException

要获取完整的堆栈跟踪,您必须查看封闭异常(及其封闭异常)的框架:

  1. 看一下省略了多少帧:“ ... X更多”
  2. 在封闭的异常中查找省略的帧
    1. 看一下省略了多少帧:“ ... Y更多”
    2. 将前X-Y帧追加到堆栈跟踪
  3. 如果Y> 0,则将其作为省略帧的数量重复步骤2

因此,如果我们想获得完整的堆栈跟踪,LowLevelException我们将执行以下操作:

  1. 看一下省略了多少帧:“ ... 3 more”
  2. 在封闭的异常中查找省略的帧(MidLevelException)中
    1. 1帧已被省略(“ ... 1个”)
    2. 将前2(3-1)帧附加到堆栈跟踪
  3. 重复步骤2,将省略的帧数设为1
    1. 查看MidLevelExceptionHighLevelException)包含的异常
    2. 将第一帧添加到堆栈跟踪

您的完整堆栈跟踪如下所示:

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

旁注:

  • 在某些情况下,可能没有列出任何框架,例如:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more

    当原因在同一行中创建时,可能会发生这种情况new HighLevelException(new MidLevelException())。不要为此感到困惑,上面描述的方法仍然可以使用,除了异常,没有帧可使用,继续其封闭。

  • 在某些情况下,您可以通过查看未被忽略的第一帧(上面的行... X more)来节省计数。如果您知道该行中的哪些方法调用了该方法,则可以直接在封闭异常的框架中搜索调用者:

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.