6

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

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

4

1 回答 1

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为新生成的进程设置标志,同时忽略所有其他跟踪消息。我使用Initial Data参数将save_calls' 选项设置为 。在最后一次通话中,我告诉 dbg 我只对新创建的进程感兴趣。我还设置了 ( ) 选项以确保跟踪标志的继承。100sosset_on_spawn

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

于 2012-08-06T10:29:11.683 回答