[squeak-dev] Re: [Pharo-project] Protecting against stack overflow ?

Bob Arning arning315 at comcast.net
Tue Dec 11 02:08:44 UTC 2012


What I found useful and simple in a particular case was a high-priority 
process on a rather short timer. Each time it woke up it checked the end 
of object memory. When that was above an arbitrary number (400M in this 
case) it opened a debugger on the offending process - known in advance 
in this case, but not too hard to figure out at the time. The overhead 
for running this is very small and did what I needed at the time.

Cheers,
Bob

On 12/10/12 8:33 PM, Eliot Miranda wrote:
>
>
>
> 2012/12/9 Sven Van Caekenberghe <sven at stfx.eu <mailto:sven at stfx.eu>>
>
>     Hi,
>
>     Would it be possible to build some kind of protection against
>     stack overflow ?
>
>
> note that there already is some mechanism.  The low space mechanism is 
> supposed to protect against stack overflow but with today's memories 
> and the difficulty of testing it, this mechanism often a) takes way 
> too long to kick in, and b) either leaves the system in a very 
> sluggish state or simply fails to kick in and the system crashes with 
> an out-of-memory error.
>
> Part of the problem is in designing a mechanism which is in keeping 
> with the reflective nature of the system.  What I mean is that we now 
> have two different VMs, the Interpreter and the STack/Cog VMs.  First 
> one wants a check which is cheap.  That means a check which isn't run 
> on every send.  In the interpreter a natural time to check for 
> recursion would be on e.g. fullGC, checking for repetition in the 
> current process's context chain.  The the Stack/Cog VMs the natural 
> time is on evacuating a stack page when the stack zone is full.  But 
> these are two different mechanisms, both of which are deep in the VM, 
> neither of which can be conveniently intercepted from Smalltalk, 
> unlike e.g. doesNotUnderstand:.
>
> Personally I like the idea of reviving the low space mechanism and 
> maintaining it properly.  For example, if the low space mechanism 
> causes the low space semaphore to fire often, because the limit was 
> set only a little way above the current memory size, and not, as it is 
> now, a little below the absolute limit, then when it fires, the low 
> space process could inspect the current process's stack (e.g. via 
> accelerated via a primitive for performance) and see how deep it is, 
> and possibly whether there is recursion (e.g. a bag of context methods 
> would soon reveal high-frequency methods, and then those contexts 
> could be inspected for repetition, but KISS says just have a 
> per-process limit on the maximum depth of stack).
>
>     This is actually the most common situation for loop/cycle that
>     either results in an unusable image or a crash.
>     Interrupting with CMD-. is not always possible.
>     A possible solution could be to just limit the stack size and
>     throw an exception.
>
>     For example, in LispWorks, it goes like this:
>
>     CL-USER 5 > (defun foo () (cons (random 100) (foo)))
>     FOO
>
>     CL-USER 6 > (foo)
>
>     Stack overflow (stack size 48128).
>       1 (continue) Extend stack by 50%.
>       2 (abort) Return to level 0.
>       3 Return to top loop level 0.
>
>     Type :b for backtrace or :c <option number> to proceed.
>     Type :bug-form "<subject>" for a bug report template or :? for
>     other options.
>
>     CL-USER 7 : 1 > :bq
>
>     ERROR <- RUNTIME:BAD-ARGS-OR-STACK <- LENGTH <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <-
>     FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO <- FOO
>     <- FOO <- FOO <- EVAL <- CAPI::CAPI-TOP-LEVEL-FUNCTION <-
>     CAPI::INTERACTIVE-PANE-TOP-LOOP <- MP::PROCESS-SG-FUNCTION
>
>     Obviously, this is possible, the question is, can it be done
>     easily and without paying an unbearable performance price ?
>
>     Sven
>
>     --
>     Sven Van Caekenberghe
>     http://stfx.eu
>     Smalltalk is the Red Pill
>
>
>
>
>
>
>
> -- 
> best,
> Eliot
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20121210/9efa8dba/attachment.htm


More information about the Squeak-dev mailing list