有没有办法指示Erlang VM将一组进程标志应用于系统中生成的每个新进程?
例如,在测试环境中,我希望每个进程都设置 save_calls 标志。
答案 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我只对新创建的进程感兴趣。我还设置了sos
(set_on_spawn
)选项以确保继承跟踪标志。
最后,请注意您需要如何使用process_flag
函数的变体,该函数需要额外的参数(要为其设置标记的进程的Pid
)。