我怀疑答案可能是" no",但为了以防万一,有没有办法在使用return_trace()时向追踪事件添加数据?
E.g。
1> erlang:trace(all, true, [call]).
...
2> MatchSpec = dbg:fun2ms(fun([Num1, Num2]) when Num1 < Num2 ->
return_trace(), message({event_name, neg_sub_event});
(_) ->
return_trace(), message({event_name, sub_event}) end).
...
3> erlang:trace_pattern({mod, sub, 2}, MatchSpec, [local]).
...
4> flush().
ok
5> spawn(mod, sub, [4, 5]).
...
6> flush().
Shell got {trace,<0.64.0>,call,
{mod,sub,[4,5]},
{event_name,neg_sub_event}}
Shell got {trace,<0.64.0>,return_from,{mod,sub,2},-1}
ok
7> spawn(mod, sub, [6, 5]).
...
8> flush().
Shell got {trace,<0.67.0>,call,{mod,sub,[6,5]},{event_name,sub_event}}
Shell got {trace,<0.67.0>,return_from,{mod,sub,2},1}
ok
我只是想出了这个例子而没有真正考虑过它...在这种情况下,我可以弄清楚它是否是一个neg_sub_event或者一个返回值包含在return_from跟踪中的一个sub_event ......但是这一点我希望不仅在激活一个调用事件时,而且在生成一个return_from事件时都包含{event_name,Name}。
这甚至可能吗?
感谢。
修改
这就是为什么我不能简单地收到一个&return?来自&#39; return_from&#39;追踪并说'好吧',所以这个&#39; return_from&#39;跟踪必须对应于最后一次通话&#39;跟踪我收到了。因此,这&#39; return_from&#39; trace必须具有最后一次&#39; call&#39;的event_name。跟踪我收到&#34;:
考虑2个进程A和B.两个调用函数F1都被一个规范跟踪,该规范说明在一种情况下(例如用参数10调用F1),&#39; call&#39;生成的trace应该具有&#34; is_ten&#34;的event_name。并且应该在调用跟踪之后生成return_trace()。因此,接收跟踪消息的进程将收到:
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_ten}}
当使用参数10和
调用F1时{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
当使用参数10调用的F1被评估并返回时。
放在F1上的另一个规范(通过erlang中使用的匹配规范:trace_pattern / 3)是,例如,当使用参数20调用F1时,&#39;调用&#39;生成的trace应该有一个event_name为&#34; is_twenty&#34;并且应该在调用跟踪之后生成return_trace()。因此,接收跟踪消息的进程将收到:
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_twenty}}
当使用参数20和
调用F1时{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
当使用参数20调用的F1被评估并返回时。
现在,如果A开始评估F1(使用arg 10),则生成一个&#39;呼叫&#39;跟踪,被抢占,B开始评估F1(使用arg 20),生成一个&#39;呼叫&#39;跟踪,被抢占,A完成对F1的评估,并生成一个“返回来自”。跟踪,接收跟踪消息的进程将收到:
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_ten}}
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_twenty}}
{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
在此阶段,如果接收跟踪消息的进程假定每个&#39; return_from&#39;跟踪消息对应于最新的呼叫&#39;消息接收,它将分配&#39; is_twenty&#39;的event_name。对于return_from消息,实际上它应该是&#39; is_ten&#39;。
答案 0 :(得分:2)
根据 erlang:trace / 3 的文档,
{trace,Pid,return_from,{M,F,Arity},ReturnValue}
被发送到跟踪器进程,所以我认为你不能再附加任何数据了。 (好吧,一个显而易见的黑客是如果返回值包含call参数......但这很难看。)
但是,如果你进行状态跟踪,(即跟踪跟踪消息序列),那么你可能会关联
带有后续 return_from 的{追踪,Pid,电话,{M,F,Args}}
消息。 您可以使用例如对于使用回调模块的 pan ,请参阅my other post。
答案 1 :(得分:1)
没有。您只能使用MatchSpec中的消息(数据)在跟踪“调用”中添加额外信息。此外,在编写规范的主体时,可以添加return_trace()。当被跟踪的函数返回时,这将生成'return_from'跟踪消息,但是,与调用有问题的函数时发送的跟踪消息不同,您不能向函数中发送的跟踪消息添加额外信息。问题回归。
E.g。
dbg:fun2ms(fun([Num1, Num2]) when Num1 < Num2 ->
return_trace(), message({event_name, neg_sub_event});
(_) ->
message({event_name, sub_event}) end).
上面生成的匹配规范,当使用erlang:trace_pattern({mod,sub,2},MatchSpec,[local])应用于函数mod:sub / 2时,将生成以下跟踪事件(当跟踪的进程时)使用erlang打开标记'call':trace / 3):
{trace, Pid, call, {Mod, Fun, Args}, {event_name, neg_sub_event}}
和
{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
当用Num1和Num2调用mod:sub / 2时,Num1 因此,您无法在“return_from”跟踪中添加“{event_name,Name}”等额外信息,因为无法在匹配规范中指定此信息。{trace, Pid, call, {Mod, Fun, Args}, {event_name, sub_event}}