tracing

Serge Aleynikov <>
Sat Sep 10 00:09:14 CEST 2005


After fixing a couple of slopy bugs this code should've read:

trace(M, F, Args) ->
   % Set up a tracer
   Fun = fun(Msg,A) -> T=[Msg|A], put(trace, T), T end,
   dbg:tracer(process, {Fun, []}),
   dbg:p(self(), call),
   dbg:tpl(M, [{'_',[],[{return_trace}]}]),

   % Call the function
   Res = apply(M, F, Args),

   % Retrieve trace
   {ok, Tracer} = dbg:get_tracer(),
   {dictionary, Dict} = process_info(Tracer, dictionary),
   dbg:stop(),
   case lists:keysearch(trace, 1, Dict) of
   {value, {_, Val}} ->
       {Res, format_trace(Val)};
   false ->
       {Res, undefined}
   end.

Serge


Serge Aleynikov wrote:
> True, but I thought there might be a more "light-weight" solution.  Dbg 
> starts it's own process which in turn starts a process handling the 
> trace process function.
> 
> One way to get its internal state that I could think of would be to 
> store the trace in the trace process function's process dictionary, and do:
> 
> trace(F, M, Args) ->
>   % Set up a tracer
>   dbg:tracer(process, {fun(M,A) -> T=[M|A], put(trace, T), T end, []}),
>   dbg:p(self(), call),
>   dbg:tpl(dbg, [{'_',[],[{return_trace}]}]),
> 
>   % Call the function
>   Res = apply(F, M, Args),
> 
>   % Retrieve trace
>   {ok, Tracer} = dbg:get_tracer(),
>   Dict = process_info(Tracer, dictionary),
>   dbg:stop(),
>   case lists:keysearch(trace, 1, Dict) of
>   {value, {_, Val}} ->
>       {Res, format_trace(Val)};
>   false
>       {Res, undefined}
>   end.
> 
> Are there more elegant ways?
> 
> Serge
> 
> Brian Buchanan wrote:
> 
>> On Fri, 9 Sep 2005, Serge Aleynikov wrote:
>>
>>> When a tracing process is setup with dbg:tracer/2 it accepts a 
>>> function that can accumulate traces in a custom accumulator, such as 
>>> this:
>>
>>
>>
>> ...
>>
>>> Is there a way to retrieve the content of this accumulator before 
>>> calling dbg:stop()?
>>
>>
>>
>> Serge,
>>
>> Why not write a simple gen_server that abstracts this functionality?  
>> The trace fun would post messages to the server, which would record 
>> them as part of its internal state.  The "stop trace" function would 
>> terminate the gen_server and return the collected trace results.
>>
>> - Brian
>>
> 

-- 
Serge Aleynikov
R&D Telecom, IDT Corp.
Tel: (973) 438-3436
Fax: (973) 438-1464




More information about the erlang-questions mailing list