システムで生成されるすべての新しいプロセスに一連のプロセスフラグを適用するようにErlangVMに指示する方法はありますか?
たとえば、テスト環境では、すべてのプロセスにsave_callsフラグを設定する必要があります。
システムで生成されるすべての新しいプロセスに一連のプロセスフラグを適用するようにErlangVMに指示する方法はありますか?
たとえば、テスト環境では、すべてのプロセスにsave_callsフラグを設定する必要があります。
これを行う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に伝えています。また、トレースフラグの継承を確実にするために ( )オプションを設定しています。100
sos
set_on_spawn
process_flag
最後に、追加の引数(Pid
フラグを設定するプロセスの引数)をとる関数のバリアントをどのように使用する必要があるかに注意してください。