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