我懷疑答案可能是「否」,但以防萬一,有沒有辦法在使用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消息。
我確實想過「關聯」兩條跟蹤消息,但它不適合我的目的。 (這個註釋部分有一點限制性的解釋...基本上,我可以有多種類型的跟蹤調用(每個都有不同的「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