Wie wird die Größe des Java-Stack-Trace erweitert, um den unteren Teil des Stacks zu sehen? (Auslösen eines Stapelüberlaufs)

8

Gibt es in Java eine Möglichkeit, den vollständigen, nicht abgeschnittenen Stack-Trace zu betrachten (z. B. durch Erhöhen der Anzahl der aufgezeichneten Frames) oder auf andere Weise den Boden eines Stack-Trace zu erreichen? Normalerweise wird der Stack-Trace bei 1024 Frames von oben abgeschnitten, aber für ein Stack-Overflow-Problem ist dies ziemlich wertlos, da Sie wirklich sehen müssen, wer den Aufruf ausgelöst hat, der die Rekursion ausgelöst hat, ganz unten. Viel besser wäre die Kürzung in der Mitte des Stacks, aber offensichtlich ist Suns JVM nicht intelligent genug, dies zu tun.

Vielleicht sogar einige spezielle Sun-spezifische Flags? Ich habe versucht, die Stack-Größe auf das Minimum zu reduzieren (-Xss1000), aber das ist immer noch mehr als 1024 Frames wert.

In meinem Fall versuche ich, einen Stack-Überlauf zu debuggen, der in einem Hadoop-Mapper auftritt, aber nur, wenn er auf einer wirklich großen Eingabe läuft. Ich nehme an, dass das Problem kommt, weil eine rekursive Operation (Scala foldRight ) auf einer wirklich, wirklich großen verknüpften Liste durchgeführt wird, und ich es nicht rekursiv schreiben muss ... aber ich muss wissen, wer den Aufruf an% gemacht hat Code%. Dies ist eine Grundroutine, die direkt und indirekt an vielen Orten aufgerufen wird und es gibt sehr viel Code, mit dem ich arbeite, also ist das nicht sehr offensichtlich.

    
Urban Vagabond 08.08.2012, 13:12
quelle

4 Antworten

13

Probieren Sie die Option -XX:MaxJavaStackTraceDepth JVM aus.

Hier ist eine Beschreibung von Stas Blog

  

max. Nein. von Zeilen im Stack-Trace für Java-Ausnahmen (0 bedeutet alle).   Mit Java & gt; 1.6, Wert 0 bedeutet wirklich 0. Wert -1 oder irgendeine negative Zahl muss angegeben werden, um den gesamten Stapel zu drucken (getestet mit 1.6.0_22, 1.7.0 unter Windows).   Bei Java & lt; = 1.5 bedeutet der Wert 0 alles, JVM die negative Zahl (getestet mit 1.5.0_22 unter Windows).

    
Odd 08.08.2012, 20:03
quelle
2

Versuchen Sie es mit jstack:

Ссылка

Ссылка

    
Edmon 08.08.2012 13:17
quelle
1

Sie können den Stack-Trace selbst durchlaufen

%Vor%

Der Standarddrucker printStackTrace druckt jede Ebene, die aufgezeichnet wurde. Ihr Problem besteht darin, dass der Stapel zu tief ist für das, was er in die Stack-Trace eingetragen hat.

Können Sie versuchen, Ihre Stackgröße zu reduzieren?

    
Peter Lawrey 08.08.2012 13:17
quelle
0

Wenn Sie Zugriff auf den Aufruf haben, bevor den vermuteten Stack-Überlauf eingeben, könnten Sie einfach einen zusätzlichen Stack-Trace wie new Exception().getStackTrace generieren. Beachten Sie, dass foldRight selbst keine unendliche Rekursion erzeugt. Vielleicht haben Sie gerade keinen Speicher mehr, versuchen Sie, die Stack-Größe der JVM zu erhöhen.

    
0__ 08.08.2012 13:17
quelle