2012-08-03 82 views
6

有沒有辦法指示Erlang VM將一組進程標誌應用於系統中產生的每個新進程?默認進程標誌

例如在測試環境中,我希望每個進程都有save_calls標誌設置。

回答

1

這樣做的一種方法是將Erlang跟蹤功能與.erlang文件結合使用。

具體來說,您可以使用erlang:trace/3提供的低級跟蹤功能,也可以利用dbg:tracer/2函數創建新的跟蹤過程,每次收到跟蹤消息時都會執行自定義處理函數。

要自動化一些事情,您可以在運行代碼的目錄或主目錄中創建一個Erlang啓動文件。 Erlang啓動文件是一個特殊的文件,名爲.erlang,每次啓動運行系統時都會執行該文件。

類似下面應該做的工作:

% -*- Erlang -*- 
erlang:display("This is automatically executed."). 
dbg:tracer(process, {fun ({trace, Pid, spawn, Pid2, {M, F, Args}}, Data) -> 
          process_flag(Pid2, save_calls, Data), 
          Data; 
         (_Trace, Data) -> 
          Data 
        end, 100}). 
dbg:p(new, [procs, sos]). 

基本上,我創建一個新的跟蹤過程,這將跟蹤過程(第一個參數)。我指定了一個處理函數來執行和一些初始數據。在處理函數中,我爲新生成的進程設置了save_calls標誌,而我忽略了所有其他跟蹤消息。我將save_calls'選項設置爲100,使用初始數據參數。在最後的調用中,我告訴dbg我只對新創建的進程感興趣。我還設置了sosset_on_spawn)選項以確保跟蹤標誌的繼承。

最後,注意你如何需要使用process_flag功能,這需要一個額外的參數(你想設置的標誌的過程中Pid)的變體。