默认进程标志

时间:2012-08-03 06:09:09

标签: erlang

有没有办法指示Erlang VM将一组进程标志应用于系统中生成的每个新进程?

例如,在测试环境中,我希望每个进程都设置 save_calls 标志。

1 个答案:

答案 0 :(得分: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)。