2012-08-03 114 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)的变体。