使用return_trace()时是否有添加消息的方法?

使用return_trace()时是否有添加消息的方法?

问题描述:

我怀疑答案可能是“否”,但以防万一,有没有办法在使用return_trace()时将数据添加到跟踪的事件?使用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 ......但要点是,我希望不仅在事件触发时包含{event_name,Name},而且还要在生成return_from事件时包含{event_name,Name}。

这甚至可能吗?

谢谢。

编辑

这就是为什么我不能简单地收到“return_from”痕迹,并说“好了,所以这‘return_from’跟踪必须与我收到的最后一个‘来电’的痕迹。因此,此'return_from'跟踪必须具有我收到的最后一个'调用'跟踪的事件名称“:

考虑2个过程A和B.两个过程都调用正在跟踪的函数F1,该规范声明在一种情况下使用10的参数调用F1),生成的“调用”跟踪应该具有“is_ten”的event_name,并且应该在调用跟踪之后生成return_trace()。因此,处理接收到的跟踪消息将接收:

{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_ten}} 

当F1被称为具有10参数,和

{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal} 

当F1,称为具有10参数,被评估并返回。另一个放置在F1上的规范(通过erlang:trace_pattern/3中使用的匹配规范)是,例如,当使用20的参数调用F1时,生成的“调用”跟踪应该具有“ is_twenty“,并且应该在调用跟踪之后生成return_trace()。因此,处理接收到的跟踪消息将接收:

{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_twenty}} 

当F1被称为与20的一个参数,和

{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal} 

当F1,称为20的参数,进行评估,并返回。如果A开始评估F1(带有参数10),产生一个'调用'轨迹,被抢占,B开始评估F1(带有参数20),产生一个'调用'轨迹,被抢占,A完成评估F1 ,并产生一个“return_from”跟踪,则处理接收的跟踪消息将接收:

{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} 

在此阶段,如果进程在接收到的跟踪消息假定每个“return_from”跟踪消息对应于最新的“呼叫'消息接收,它实际上应该是'is_ten',它将把'is_twenty'的event_name赋给return_from消息。

不可以。您只能使用MatchSpec中的消息(数据)在跟踪“调用”中添加额外信息。此外,在编写规范的主体时,可以添加一个return_trace()。当被跟踪的函数返回BUT时,这将产生一个'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). 

匹配规范的上方产生,当施加到函数MOD:子/ 2使用的erlang:trace_pattern({MOD,分,2},MatchSpec,[本地]),将产生下面的跟踪事件(当所跟踪的方法具有标记 '称之为' 导通使用的erlang:跟踪/ 3):

{trace, Pid, call, {Mod, Fun, Args}, {event_name, neg_sub_event}} 

{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal} 

当MOD:子/ 2被称为与NUM1和NUM2使得NUM1 < Num2 。 在所有其他情况下,生成的跟踪将是:

{trace, Pid, call, {Mod, Fun, Args}, {event_name, sub_event}} 

因此,你不能添加额外的信息,如“{EVENT_NAME,名}”到“return_from”追踪,因为没有在指定此方式匹配规范。

根据该文档为的erlang:跟踪/ 3

{跟踪,PID,return_from,{M,F,元数},返回值}

被发送到跟踪程序,所以我认为你不能再附加任何数据。 (好吧,如果返回值包含调用参数,这是一个明显的缺陷......但是这样会很难看)。但是,如果你进行有状态跟踪(即追踪跟踪消息序列),那么你可能会关联的

{跟踪,PID,呼叫,{M,F,参数数量}}上面的后续 return_from

消息。 您可以使用例如pan对于回调模块,请参阅my other post

+0

我确实想过“关联”两条跟踪消息,但它不适合我的目的。 (这个注释部分有一点限制性的解释...基本上,我可以有多种类型的跟踪调用(每个都有不同的“event_name”)用于输入函数,但是如果从函数返回的事件不会'没有名字,我将如何关联这两个?)。无论如何谢谢你的回复tzp。 – justin 2012-03-22 11:17:24

+0

那么,我仍然认为,所有的事情都可以通过** pan **回调模块来实现。例如。你看到一个调用mod:mul(4,5)调用由进程P创建,现在你可以存储标记有你需要的任何信息的地方,比如操作,参数,例如。 store {{P,last_call},{mod,mul,[4,5]}}。然后你看到一个后续的_P,return_from,{mod,mul,2},20_消息,然后查找{P,last_call}并继续... – tzp 2012-03-22 14:09:49

+0

好吧,我现在明白了。你的意思是“不要假设return_from消息对应于你收到的最新的'call'消息,而是实际存储你收到的每个'call'(连同产生它的进程的pid),然后当你收到'return_from'查找匹配'return_from'的pid的'call'声音可行,但是这种方法对于我正在做的事情有太多问题1.效率2.你怎么知道进程没有做到这一点?不会产生'return_from'等等......不过,这可能是一种方法,再次感谢tzp。 – justin 2012-03-22 14:22:06