[erlang-questions] Examining bindings on the stack

Brian Candler B.Candler@REDACTED
Wed Sep 10 10:28:25 CEST 2008


On Wed, Sep 10, 2008 at 07:33:46AM +0200, Nicolas Charpentier wrote:
> As dbg is complex, I can't give you exactly the instructions to type but  
> basically to activate trace on a specific function it will be something  
> like that:
>
> > dbg:tracer().
> > dbg:p(all,[c]).
> > dbg:tpl(Module,Function,Match_spec).
>
> The Match_spec allow you to filter the function call you want to trace  
> according to the value of the parameter. By default I always use
> Match_spec = [{'_',[],[{return_trace}]}].

This does the job perfectly, thank you. It's rather cool to watch recursive
functions expanding themselves:

  (<0.36.0>) call adder:addup([1,2,3])

  (<0.36.0>) call adder:addup([1,2,3],0)
  (<0.36.0>) call adder:addup([2,3],1)
  (<0.36.0>) call adder:addup([3],3)
  (<0.36.0>) call adder:addup([],6)

so I think could usefully be introduced to new erlangers very early on. I
also see it can trace messages in and out of a process.

A question: is it possible to call dbg:p in such a way as to clear
individual flags? The reason is that I found

   dbg:p(Regname,[all]).

disables display of the function arguments. After some digging, I found it's
because 'all' sets the 'arity' flag too (documented under erlang:trace/3)

I finally managed to clear just the arity flag by talking to the lower layer:

    erlang:trace(whereis(Regname), false, [arity]).

but I can't see a way in dbg to do this. dbg:p(Regname,[clear]) clears them
all.

Regards,

Brian.



More information about the erlang-questions mailing list