2012-03-20 65 views
0

我懷疑答案可能是「否」,但以防萬一,有沒有辦法在使用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消息。

回答

1

不可以。您只能使用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」追蹤,因爲沒有在指定此方式匹配規範。

2

根據該文檔爲的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

相關問題