Stack level too deep (SystemStackError)

J

Jesper Olsen

I have a program where I'm getting a Stack level too deep (SystemStackError)
exception

I did not expect this, and I would prefer to fix it by increasing the
stack, rather than changing the program...

Is this possible?
I think this exception is quite common, but was not able to google a
solution.

Jesper
 
G

Gennady

Jesper said:
I have a program where I'm getting a Stack level too deep (SystemStackError)
exception

I did not expect this, and I would prefer to fix it by increasing the
stack, rather than changing the program...

Is this possible?
I think this exception is quite common, but was not able to google a
solution.

Jesper
What's your OS? BTW, it is a known issue with Mac OS X where in most
cases you must increase the default stack size.

Gennady.
 
J

Jesper Olsen

Gennady said:
What's your OS? BTW, it is a known issue with Mac OS X where in most
cases you must increase the default stack size.
How?


Gennady.

It happens both with

- Ruby 1.6.8 on BSD Unix
- Ruby 1.8.0 on Win2000


Jesper
 
G

Gennady


In bash, "ulimit -s" shows the current stack size in kbytes (defaults
to 8192 in Mac OS X, really low). To change it issue "ulimit -s
<kbytes>".

The command may be different for other shells. You may put this command
in /etc/profile to be set every time a user logs in.
It happens both with

- Ruby 1.6.8 on BSD Unix
- Ruby 1.8.0 on Win2000

The above command will work for BSD Unix too. I do not know how to do
it for Win2000.

Are you sure that there's no actual problem with your program? It may
really be run-away in recursion, so increasing the stack size will only
make the problem happen somewhat later.

Sincerely,
Gennady Bystritsky
 
R

Robert Klemme

Gennady said:
In bash, "ulimit -s" shows the current stack size in kbytes (defaults
to 8192 in Mac OS X, really low). To change it issue "ulimit -s
<kbytes>".

The command may be different for other shells. You may put this command
in /etc/profile to be set every time a user logs in.


The above command will work for BSD Unix too. I do not know how to do
it for Win2000.

Are you sure that there's no actual problem with your program? It may
really be run-away in recursion, so increasing the stack size will only
make the problem happen somewhat later.

Hm. On cygwin this happens:

10:15:30 [ContentReporter_BRANCH]: cat /c/temp/ruby/ulimit.sh
#!/bin/bash -f

ruby -e 'def t(i);p i;t(i+1);end;t(0)'
ulimit -s


<lines deleted>
13281
13282
13283
-e:1:in `p': stack level too deep (SystemStackError)
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
... 13274 levels...
from -e:1:in `t'
from -e:1:in `t'
from -e:1:in `t'
from -e:1
2047

This means that a stack size of approx 2MB suffices only for 13000+ stack
levels. IOW about 157 bytes per stack frame.

Unfortunately this can't be changed on cygwin:

10:16:06 [ContentReporter_BRANCH]: ulimit -s 4096
bash: ulimit: stack size: cannot modify limit: Invalid argument
10:18:19 [ContentReporter_BRANCH]: ulimit -S -s 4096
bash: ulimit: stack size: cannot modify limit: Invalid argument
10:18:23 [ContentReporter_BRANCH]: ulimit -H -s 4096
bash: ulimit: stack size: cannot modify limit: Invalid argument

I've always felt that Ruby is not too comfortable with recursion...

Cheers

robert
 
J

Jesper Olsen

Gennady said:
In bash, "ulimit -s" shows the current stack size in kbytes (defaults
to 8192 in Mac OS X, really low). To change it issue "ulimit -s
<kbytes>".
Sincerely,
Gennady Bystritsky

Thanks Gennady - that helped. (Mine was 4096)

Cheers
Jesper
 
G

gabriele renzi

On Jan 14, 2004, at 23:31, Jesper Olsen wrote:


In bash, "ulimit -s" shows the current stack size in kbytes (defaults
to 8192 in Mac OS X, really low). To change it issue "ulimit -s
<kbytes>".

on a sidenote, someone I know has the same max stack size as me
(8192), and with slightly different versions of 1.8.1, on debian he's
got a SystemStackError calculating ackermann(3,7), while I can even
calculate ackermann(3,8).
I'm not a unix guru, may be possible that there are other things to
look for?


the ackermann implementation is:
def ackermann(m, n)
if m == 0
n + 1
elsif n == 0
ack(m - 1, 1)
else
ack(m - 1, ack(m, n - 1))
end
end
 
V

Van Jacques

gabriele renzi said:
il Thu, 15 Jan 2004 17:18:17 +0900, Gennady <[email protected]> ha
scritto::
I had the same problem with stacksize too low on a MAC OS X,
running the 3n+1 problem. It would go till the number in the 30s
where there are many iterations, then give me the stacksize
error. Increasing the stacksize solved the problem.

Van
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top