[gambit-list] heapoverflows
Marc Feeley
feeley at iro.umontreal.ca
Sun Jun 28 10:08:00 EDT 2009
On 27-Jun-09, at 10:29 PM, lowly coder wrote:
> I understand the when I get a heapoverflow, gambit can't pop me into
> a REPL (since that'll take more heap).
That's not true. The heap management was designed to trigger a "heap
overflow" exception before the heap is completely full. A space
called the "heap overflow reserve" is set aside and when there is a
(non-fatal) heap overflow, a large part of this space is given back to
the heap so that the debugger (which is written in Scheme) can still
do its work. A subsequent heap overflow will give back a large part
of what's left of the new heap overflow reserve, and so on. When the
heap overflow reserve is insufficient to run the exception handler (or
the REPL that it starts) then a "fatal heap overflow" terminates the
program.
>
> However, can I get a dying process to print out a backtrace for me?
> (Increasing the maximum heap size won't solve this problem -- the
> problem is that I have some run away code that is consuming up all
> the memory, and if I increase the max heap size, all that happens is
> that it just makes it longer to heap overflow).
>
> [I debugged the last one manually by trying pieces of code here &
> there; but if I could get a backtrace, it'd just be so much faster]
>
Do you get something like this?
% gsi -:h10000
Gambit v4.4.4
> (define (f n) (let ((v (make-vector 5))) (cons v (f (+ n 1)))))
> (f 0)
*** ERROR IN f, (console)@1.50 -- Heap overflow
1> ,be
0 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47825
1 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47824
2 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47823
3 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47822
4 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47821
5 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47820
6 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47819
7 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47818
8 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47817
9 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 47816
...
47823 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 2
47824 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 1
47825 f (console)@1:50 (f (+ n 1))
v = '#(0 0 0 0 0)
n = 0
47826 (interaction) (console)@2:1 (f 0)
1>
Marc
More information about the Gambit-list
mailing list