Ruby Stack-Level zu tief Ausnahme NICHT von der rekursiven Endlosschleife

9

BEARBEITEN: (Gelöst) Tatsächlich wurde es wahrscheinlich wegen einer Endlosschleife ausgelöst

Ich habe programmiert und nachdem ich eine Methode hinzugefügt habe, habe ich folgendes bekommen:

%Vor%

Ich bin mir ziemlich sicher, dass es keine unendliche rekursive Schleife gibt.

Der Code ist im Moment irgendwie gemifiziert, aber ich habe auch den Fehler bekommen, die Ruby-Datei direkt auszuführen.

Danke für jede Hilfe, wie man (zu einigen Informationen, zu einigen Tests) das Problem beheben kann, wenn möglich, ohne das Ganze neu schreiben zu müssen ...

Umgebung:

  • ruby ​​1.9.3p194 / rails 3.2.8, installiert über rvm
  • das Programm in diesem Stadium verwendet nur Rails String Inflexions Funktionen
  • Betriebssystem: Linux Kubuntu i386
  • Speicher 4GO
  • 'ulimit -s': 8192 (Stapelgröße in kB)

Was ich erfolglos versucht habe:

  • entfernte den Codeblock, in dem die Ausnahme anfänglich ausgelöst wurde, wurde jedoch zur Laufzeit noch ein kleines Bit zur Laufzeit erhöht
  • legt die Stackgröße mit der Befehlszeile 'ulimit -s 20000', 'ulimit -s unlimited' fest. Derselbe Fehler, anscheinend am selben Ort (was mich glauben lässt, dass die Stapelgröße nicht wirklich geändert wurde)
  • downgraded zu ruby1.9.2 / rails3.1.3, erhielt dieselbe Nachricht
  • gleicher Fehler unter Windows

Anwendungskontext:

Ich schreibe eine Anwendung, die Ruby Mixins stark verwendet.

Außerdem habe ich eine Reihe von Klassen erstellt, die Mixins generieren (Instanz- / Klassenmethodenmodule, die von anderen Klassen eingefügt werden).

Alles in allem habe ich also ziemlich viele generierte benannte Module mit einigen benutzerdefinierten generierten Codes und Klassen mit vielen Vorfahren.

Aber das sollte mir schließlich eine Menge Schmerzen in der as $ ersparen, wenn ich das Programm schreibe, das oben auf dieser Lib sitzt (das ist der Plan sowieso).

Ressourcen, die ich verwendet habe:

BEARBEITEN: Bis etwas Code für das Zeigen / Testen verfügbar ist, lassen Sie uns meine Frage zu diesem Thema abstrahieren: Gibt es andere Fälle, die die Stapelebene zu tief außer der klassischen Programmausführung-Struktur anheben? - zu tiefes Szenario (das Überstreichen der Finger ist klar und bedeutet etwas ...)?

    
ergo sum cogito 30.10.2012, 12:51
quelle

1 Antwort

3
  

Gibt es andere Fälle, die neben dem klassischen Programm-Ausführungsbaum-ist-zu-tief-Szenario eine zu hohe Stack-Level-Ausnahme auslösen?

Ja. Da der Stapel nicht in der Tiefe gemessen wird, sondern in Bytes, wird alles, was auf dem Stapel gespeichert ist, früher gefüllt:

%Vor%

In diesem Beispiel kann eine Funktion mit nur einer Variablen mehrere tausend Aufrufe tief gehen, bevor sie fehlschlägt, und das Hinzufügen von drei weiteren Variablen tut sehr wenig; Wenn Sie jedoch 26 weitere Variablen hinzufügen, wird die Stapelgröße auf einen Wert erhöht, bei dem nur etwa 3000 Ebenen verfügbar sind.

Das hängt natürlich etwas von der Ruby-Implementierung und dem System ab, auf dem es läuft. Aber ich glaube, das wird immer als allgemeine Regel gelten.

Allerdings denke ich immer noch, dass Rekursion wahrscheinlich Ihr Problem ist, da die Anzahl der Variablen, die erforderlich ist, um dies bei kleinen Anrufkettenlängen passieren zu lassen, immens ist.

    
marcus erronius 14.12.2012, 21:34
quelle

Tags und Links