Wie erhöhe ich die Anzahl der angezeigten Zeilen eines Java-Stack-Trace-Dumps?

Antworten:

121

Du musst nicht; Diese Informationen sind an anderer Stelle in der Stapelverfolgung vorhanden. Aus den Dokumenten von printStackTrace():

Beachten Sie das Vorhandensein von Zeilen, die die Zeichen enthalten "...". Diese Zeilen geben an, dass der Rest der Stapelverfolgung für diese Ausnahme mit der angegebenen Anzahl von Frames am unteren Rand der Stapelverfolgung der Ausnahme übereinstimmt, die durch diese Ausnahme verursacht wurde (die "einschließende" Ausnahme).

Diese Abkürzung kann die Länge der Ausgabe in dem allgemeinen Fall, in dem eine umschlossene Ausnahme von derselben Methode ausgelöst wird, mit der die "verursachende Ausnahme" abgefangen wird, erheblich reduzieren.

Mit anderen Worten, die "... x more"einzige wird nur in einer verketteten Ausnahme angezeigt und nur dann, wenn die letzten xZeilen der Stapelverfolgung bereits als Teil der Stapelverfolgung einer anderen verketteten Ausnahme vorhanden sind.

Angenommen, eine Methode fängt die Ausnahme Foo ab, umschließt sie mit der Ausnahmeleiste und löst die Leiste aus. Dann wird die Stapelspur von Foo gekürzt. Wenn Sie aus irgendeinem Grund die vollständige Ablaufverfolgung wünschen, müssen Sie nur die letzte Zeile vor der ...Stapelverfolgung in Foo nehmen und sie in der Stapelverfolgung in der Leiste suchen. Alles unter dieser Zeile ist genau das, was in Foos Stack-Trace gedruckt worden wäre.

Michael Myers
quelle
Der letzte Absatz ist irreführend. Es wird keine Überlappung geben, die Linie davor ...ist das erste Bild, das sich unterscheidet. Es wird jedoch zumindest in derselben Klasse sein, was hilft, es zu finden.
Marcono1234
5

Erraten Sie schnell eine Methode für Sie.

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

Nehmen wir den Stack-Trace aus der Dokumentation von 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

Die Ursachen werden von der am meisten verschachtelten unten (der "Grundursache") bis zu der Ursache angezeigt, zu der die gedruckte Stapelverfolgung gehört.

In diesem Fall ist die Grundursache LowLevelException, welche Ursache MidLevelException, welche Ursache HighLevelException.

Um den vollständigen Stack-Trace zu erhalten, müssen Sie sich die Frames der einschließenden Ausnahme (und ihrer einschließenden Ausnahmen) ansehen:

  1. Schauen Sie sich an, wie viele Frames weggelassen wurden: "... X mehr"
  2. Suchen Sie in der beiliegenden Ausnahme nach den ausgelassenen Frames
    1. Schauen Sie sich an, wie viele Frames weggelassen wurden: "... Y more"
    2. Hängen Sie die ersten X-Y-Frames an den Stack-Trace an
  3. Wenn Y> 0, wiederholen Sie Schritt 2 damit als Anzahl der ausgelassenen Frames

Wenn wir also den vollständigen Stack-Trace von erhalten LowLevelExceptionmöchten, würden wir Folgendes tun:

  1. Schauen Sie sich an, wie viele Frames weggelassen wurden: "... 3 weitere"
  2. Suchen Sie nach den ausgelassenen Frames in der beiliegenden Ausnahme ( MidLevelException)
    1. 1 Frame wurde weggelassen ("... 1 weitere")
    2. Hängen Sie die ersten 2 (3 - 1) Frames an den Stack-Trace an
  3. Wiederholen Sie Schritt 2 mit 1 als Anzahl der ausgelassenen Frames
    1. Schauen Sie sich die beiliegende Ausnahme von MidLevelException( HighLevelException) an.
    2. Hängen Sie den ersten 1 Frame an die Stapelverfolgung an

Ihre vollständige Stapelverfolgung sieht dann folgendermaßen aus:

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)

Randnotizen:

  • Es kann Fälle geben, in denen keine Frames aufgelistet sind, z.

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

    Dies kann passieren, wenn die Ursache in derselben Zeile liegt : new HighLevelException(new MidLevelException()). Lassen Sie sich davon nicht verwirren, der oben beschriebene Ansatz funktioniert immer noch. Es gibt nur keine Frames, die von der Ausnahme verwendet werden können. Fahren Sie mit dem einschließenden fort.

  • In einigen Fällen können Sie sich das Zählen ersparen, indem Sie sich den ersten Frame ansehen, der nicht ausgelassen wurde (die obige Zeile ... X more). Wenn Sie wissen, welche Methoden die Methode in dieser Zeile aufrufen, können Sie direkt nach den Aufrufern in den Frames der einschließenden Ausnahme suchen:

    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
    
Marcono1234
quelle