使用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。
我确实想过“关联”两条跟踪消息,但它不适合我的目的。 (这个注释部分有一点限制性的解释...基本上,我可以有多种类型的跟踪调用(每个都有不同的“event_name”)用于输入函数,但是如果从函数返回的事件不会'没有名字,我将如何关联这两个?)。无论如何谢谢你的回复tzp。 – justin 2012-03-22 11:17:24
那么,我仍然认为,所有的事情都可以通过** 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
好吧,我现在明白了。你的意思是“不要假设return_from消息对应于你收到的最新的'call'消息,而是实际存储你收到的每个'call'(连同产生它的进程的pid),然后当你收到'return_from'查找匹配'return_from'的pid的'call'声音可行,但是这种方法对于我正在做的事情有太多问题1.效率2.你怎么知道进程没有做到这一点?不会产生'return_from'等等......不过,这可能是一种方法,再次感谢tzp。 – justin 2012-03-22 14:22:06