zamieszczaniu pytanie przepełnienia stosu na stackoverflow.com, jak zabawny :-)Jak zwiększyć rozmiar stosu dla aplikacji ruby. Rekurencyjne app uzyskanie: Poziom Stos zbyt głębokie (SystemStackError)
biegnę trochę rekurencyjną kodu Ruby i otrzymuję: "Stack level too deep (SystemStackError)"
(Jestem całkiem pewny, że kod działa, że nie jestem w nieskończonej rekurencyjnej spirali śmierci, ale to nie jest w gruncie rzeczy)
Czy mimo to można zmienić dozwoloną grubość/rozmiar stosu dla mojej aplikacji Ruby?
Nie do końca rozumiem, jeśli jest to ograniczenie w Rubim, ponieważ błąd mówi "Poziom stosu", co daje mi wrażenie, że Ruby w jakiś sposób liczy "poziomy" stosu lub jeśli po prostu oznacza to, że stos jest pełny.
Próbowałem uruchomić ten program zarówno pod Vistą, jak i Ubuntu z tym samym wynikiem. Pod Ubuntu próbowałem zmienić rozmiar stosu za pomocą "ulimit -s" z 8192 na 16000, ale to niczego nie zmieniło.
Edytuj: Dzięki za opinię.
Zdaję sobie sprawę, że używanie funkcji rekursywnej może nie jest najbardziej niezawodną metodą. Ale nie o to chodzi. Po prostu zastanawiam się, czy istnieje sposób na zwiększenie rozmiaru stosu .. okresu. I jak wspomniałem, spróbowałem uruchomić ulimit -s 16000 przed uruchomieniem skryptu ruby .. bez poprawy .. Czy używam go źle?
Edit2: W rzeczywistości miałem nieskończoną rekurencję w skrajnym przypadku kodu.
Ścinany ślad stosu ruby po błędzie "Stack level too deep"
jest nieco mylący.
Po zachowaniu rekursywnym obejmującym kilka funkcji, można odnieść wrażenie, że liczba rekursji jest znacznie niższa niż w rzeczywistości. W tym przykładzie jednej rzeczy, że może to wywala po nieco ponad 190 połączeń, ale w rzeczywistości jest to około 15.000 połączeń
tst.rb:8:in `p': stack level too deep (SystemStackError)
from tst.rb:8:in `bar'
from tst.rb:12:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
... 190 levels...
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:22
-Andreas
Ta odpowiedź jest poprawna dla wersji Ruby przed 1.9. Wersja 1.9 lub nowsza - patrz http://stackoverflow.com/a/27510458/238886 –