实现此目的的一种方法是将 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您要为其设置标志的进程的参数)。