[erlang-questions] Simple wrapper around dbg?

Patrik Nyblom pan@REDACTED
Thu Nov 8 16:28:24 CET 2012


On 11/06/2012 03:33 PM, Attila Rajmund Nohl wrote:
> Hello!
>
> I can trace a function call with specific arguments with a command like this:
>
> dbg:tpl(foo, bar, dbg:fun2ms(fun([baz,_]) -> return_trace(),
> exception_trace() end)).
>
> However, it's a long to type, I'd like to have a wrapper around it.
> The naive solution doesn't even compile:
>
> -module(d).
>
> -export([mfa/3]).
>
> mfa(M, F, A) ->
>      dbg:tpl(M, F, dbg:fun2ms(fun(Args) when Args==A -> return_trace(),
> exception_trace() end)).
As described in the docs ( 
http://www.erlang.org/doc/man/dbg.html#fun2ms-1), you'll need to include 
ms_transform.hrl if calling dbg:fun2ms inside a module, so this:
---------------
-module(d).
-include_lib("stdlib/include/ms_transform.hrl").
-export([mfa/3]).

mfa(M, F, A) ->
     dbg:tpl(M, F, dbg:fun2ms(fun(Args) when Args==A -> return_trace(),
exception_trace() end)).
----------------
compiles and works to a certain extent.
> because there are no return_trace() and exception_trace() functions in
> the module. Even if it'd compile, I couldn't call it like this:
>
> d:mfa(foo, bar, [baz, _]).
This is more tricky, you cannot send unbound variables to a function - 
it has little to do with dbg:fun2ms. Either you have to write your own 
parse_transform, which cannot be used from the shell, or you could use 
the match_spec syntax for the variables in the argument list and skip 
fun2ms altogether...
Look at this in the shell:
1> dbg:fun2ms(fun([baz,A,_])  -> return__trace(),exception_trace() end).
[{[baz,'_'],[],[{return_trace},{exception_trace}]}]
The argument list is translated so that anonymous variables become the 
atom '_' and named variables become '$n', where n is an integer > 0. You 
can write your function as:

mfa(M, F, A) ->
     dbg:tpl(M, F, [{A,[],[{return_trace},{exception_trace}]}]).

and call it as:
d:mfa(foo,bar,[baz,'_']).

In that case you will not need the parse_transform.

BTW, you can remove return_trace, exception_trace includes return_trace.

Cheers,
/Patrik

>
> because the _ variable is not bound. Is there a simple workaround or
> shall I start to read up on parse_transforms?
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20121108/edd1d6c0/attachment.htm>


More information about the erlang-questions mailing list