GHCi debugger status

Simon Marlow marlowsd at
Tue Nov 25 04:20:41 EST 2008

Claus Reinke wrote:
>> fun x y =
>> let f1 = ... (f2 x) ...   -- f1 calls f2
>>     f2 x = x * 2
>> in case x of
>>     1 -> f2 0
>>     _ -> f2 (f1 y)
>> g x = let z = (some complex computation) in z `div` x
>> main = print (g (fun 1 2))
>> This is a classical example of why laziness gets in the way of
>> debugging. Now, when (f2 0) gets finally evaluated and throws a
>> divByZero error, x and y are nowhere to be found.
>> Since we do not have a real dynamic stack, it is difficult to say
>> where their values should be stored. The only place I can think of is
>> at the breakpoint itself, but then as Simon said this poses a serious
>> efficiency problem.
> Isn't that a case of premature optimization? I will happily compain
> about performance issues later, after the debugger turns out to be
> merely too slow!-)

No, it's a real problem.  If we retained all the variables in scope at 
every breakpoint, GHCi would grow a whole bunch of space leaks.  It's 
pretty important that adding debugging shouldn't change the space behaviour 
of the program.  Of course, constant factors are fine, but we're talking 
asymptotic changes here.

Now perhaps it would be possible to arrange that the extra variables are 
only retained if they are needed by a future breakpoint, but that's tricky 
(conditional stubbing of variables), and :trace effectively enables all 
breakpoints so you get the space leaks back.

A similar argument applies to keeping the dynamic stack.  The problem with 
the dynamic stack is that it doesn't look much like you expect, due to 
tail-calls.  However, I think it would be good to let the user browse the 
dynamic stack (somehow, I haven't thought through how hard this would be). 
  But what I'd really like is to give the user access to the *lexical* 
stack, by re-using the functionality that we already have for tracking the 
lexical stack in the profiler.  See

 > (btw, is there a debugger home page
> on the wiki, where issues/FAQs like "why can't I have scope contexts" 
> are documented?)

No, please by all means start one.


More information about the Glasgow-haskell-users mailing list