765 Stimmen

Fehler beim Überschreiten der maximalen Aufrufstapelgröße

Ich verwende eine Direct Web Remoting (DWR) JavaScript-Bibliotheksdatei und erhalte nur in Safari (Desktop und iPad) einen Fehler

Dort heißt es

Maximale Größe des Aufrufstapels überschritten.

Was genau bedeutet dieser Fehler, und wird die Verarbeitung vollständig abgebrochen?

Auch eine Lösung für Safari Browser (eigentlich auf der iPad Safari heißt es

JS:execution exceeded timeout

Ich nehme an, dass es sich dabei um dasselbe Problem mit dem Aufrufstapel handelt.)

4 Stimmen

Ich bekam diesen Fehler, als ich versuchte, Variablen (ohne sie zu deklarieren) zu senden, durch data in Ajax. Der Fehler wurde durch Deklaration der Variablen behoben.

0 Stimmen

Endlosschleife ...

0 Stimmen

Bei mir war der Name meiner JavaScript-Funktion onclick() und ich bekam diesen Fehler :-) Dies sind zwar reservierte Namen

844voto

alex Punkte 457905

Das bedeutet, dass Sie irgendwo in Ihrem Code eine Funktion aufrufen, die wiederum eine andere Funktion aufruft und so weiter, bis Sie die Grenze des Aufrufstapels erreichen.

Das liegt fast immer an einer rekursiven Funktion mit einem Basisfall, der nicht erfüllt wird.

Ansicht des Stapels

Betrachten Sie diesen Code...

(function a() {
    a();
})();

Hier ist der Stapel nach einer Handvoll Aufrufen...

Web Inspector

Wie Sie sehen können, wächst der Aufrufstapel, bis er an eine Grenze stößt: die im Browser fest einprogrammierte Stapelgröße oder die Erschöpfung des Speichers.

Um dies zu beheben, stellen Sie sicher, dass Ihre rekursive Funktion einen Basisfall hat, der erfüllt werden kann...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);

7 Stimmen

Thx viel für das So gibt es irgendeine Möglichkeit/Tool, durch die ich kann, dass die Stapelgrenze erschöpft ist Wieder, wie dies eine riesige Bibliothek-Datei ist und nicht von mir erstellt, ich bin nicht ganz bewusst, wo die Dinge falsch gehen könnte.

1 Stimmen

Also mit dem Inspector in Safari, ich werde in der Lage sein, die "Call Stack" zu sehen... Auch muss ich den Stapel für eine bestimmte Funktion oder für die gesamte JS... wie genau überprüfen ich für diese Call Stack?

0 Stimmen

@hmthr Ich habe Google Chrome verwendet, aber ich erinnere mich, dass der Safari-Inspektor ziemlich ähnlich ist.

115voto

FK- Punkte 1352

In meinem Fall habe ich Eingabeelemente anstelle ihrer Werte gesendet:

$.post( '',{ registerName: $('#registerName') } )

Anstelle von:

$.post( '',{ registerName: $('#registerName').val() } )

Das hat meine Chrome-Registerkarte so weit eingefroren, dass sie mir nicht einmal mehr das Dialogfeld "Warten/Beenden" anzeigte, wenn die Seite nicht mehr reagierte...

5 Stimmen

Ich frage mich, warum es keine Ausnahme für diesen Fehler gibt... Danke!

1 Stimmen

Vielen Dank, das hat mich gerettet.

0 Stimmen

Ich wollte dies gerade als mögliche Lösung hinzufügen. Ich habe gerade genau das getan lol

106voto

lucygenik Punkte 1598

Dies kann manchmal auftreten, wenn Sie versehentlich dieselbe JavaScript-Datei zweimal importieren/einbetten; es lohnt sich, dies auf der Registerkarte "Ressourcen" des Inspektors zu überprüfen.

10 Stimmen

Dieses Problem tritt normalerweise auf, wenn Sie versehentlich dieselbe JS-Datei zweimal importieren/einbetten. Über den genauen Prozess, der die rekursive Schleife verursacht, möchte ich nicht spekulieren, aber ich würde annehmen, dass es so ist, als würden zwei identische Autos mit 100 km/h durch dieselbe Mautstelle fahren.

4 Stimmen

Ich glaube nicht, dass dies der Fall ist. Wenn zwei gleichartige Funktionen oder Variablen eingebettet sind, überschreibt die letztere die vorherigen Definitionen.

0 Stimmen

Ja... Ich weiß nicht wirklich, warum das passiert oder wie der Prozess abläuft, aber ich hätte gedacht, dass es auch überschrieben werden würde.

37voto

Aaron Digulla Punkte 308693

Irgendwo in Ihrem Code befindet sich eine rekursive Schleife (d. h. eine Funktion, die sich selbst immer wieder aufruft, bis der Stack voll ist).

Andere Browser haben entweder größere Stapel (so dass Sie stattdessen eine Zeitüberschreitung erhalten) oder sie schlucken den Fehler aus irgendeinem Grund (vielleicht eine schlecht platzierte Try-Catch).

Verwenden Sie den Debugger, um den Aufrufstapel zu überprüfen, wenn der Fehler auftritt.

0 Stimmen

Vielen Dank für Ihre Antwort. Auf IE/FF, der Code scheint zu laufen gut Nur in Desktop-Safari und iPad Safari, bekomme ich den Fehler. Eigentlich ist die JS-Datei nicht meine eigene Schöpfung, sondern ist eine Bibliothek-Datei (von DWR engine.js) directwebremoting.org Auch wenn Sie sagen, "Debugger, um den Aufrufstapel zu überprüfen", wie kann ich tun, dass mit dem Safari-Inspektor?

0 Stimmen

Ich habe keine Erfahrung mit Safari Inspector. Versuchen Sie, den JavaScript-Debugger zu öffnen und Ihre Seite zu laden. Der Debugger sollte anhalten, wenn ein nicht abgefangener Fehler ausgelöst wird. Wenn das nicht funktioniert, fragen Sie den Superuser oder Webmaster (siehe unten auf der Seite)

0 Stimmen

Hatte 2 Funktionen mit demselben Namen!! DOH!

32voto

Simon_Weaver Punkte 129442

Das Problem bei der Erkennung von Stackoverflows besteht darin, dass sich der Stacktrace manchmal abwickelt und man nicht sehen kann, was tatsächlich passiert.

Ich habe einige der neueren Debugging-Tools von Chrome für nützlich befunden.

Drücken Sie die Performance tab vergewissern Sie sich Javascript samples aktiviert sind, erhalten Sie etwa folgendes Bild.

Es ist ziemlich offensichtlich, wo hier der Überlauf ist! Wenn Sie auf extendObject können Sie die genaue Zeilennummer des Codes sehen.

enter image description here

Sie können auch Zeitangaben sehen, die entweder hilfreich oder ein Ablenkungsmanöver sein können.

enter image description here


Ein weiterer nützlicher Trick, wenn Sie das Problem nicht wirklich finden können, ist, viele console.log Erklären Sie, wo Ihrer Meinung nach das Problem liegt. Der obige Schritt kann Ihnen dabei helfen.

Wenn Sie in Chrome wiederholt identische Daten ausgeben, werden diese wie folgt angezeigt und zeigen deutlicher, wo das Problem liegt. In diesem Fall erreichte der Stapel 7152 Frames, bevor er schließlich abstürzte:

enter image description here

1 Stimmen

Für alle, die diese Antwort lesen. Natürlich hat es bei mir funktioniert und ich konnte das Problem auf einen rekursiven Funktionsaufruf eingrenzen. Mit der Registerkarte "Leistung" konnte ich das Problem auf Anhieb nachvollziehen. Es war auf 2 Angular-Elemente zurückzuführen, die in einer separaten App enthalten waren. Sobald ich eines der Elemente deaktiviert hatte, verschwand das Problem. Hoffentlich hilft das jemandem!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X