默认进程标志

Max*_*sky 6 erlang

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

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

Rob*_*loi 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]).
Run Code Online (Sandbox Code Playgroud)

基本上,我正在创建一个新的跟踪进程,它将跟踪进程(第一个参数)。我指定要执行的处理程序函数和一些初始数据。在处理程序函数中,我save_calls为新生成的进程设置标志,同时忽略所有其他跟踪消息。我使用初始数据save_calls参数将 ' 选项设置为。在最后一次调用中,我告诉 dbg 我只对新创建的进程感兴趣。我还设置 ( ) 选项以确保跟踪标志的继承。100sosset_on_spawn

最后,请注意如何使用该函数的变体process_flag,该变体需要一个额外的参数(Pid您要为其设置标志的进程的参数)。