Erlangのトレーサに関する質問と、トレースイベントを失うことなくこれらのスイッチをオン/オフに切り替える方法を教えてください。トレースイベントを失うことなくErlangトレーサを停止して起動する
erlang:trace(P1Pid, true, [set_on_spawn, send, 'receive', {tracer, T1Pid}])
set_on_spawn
フラグが指定されているので、(サブ)プロセスP2は、P1によって生成されると、同じ:私は同様に、send
とreceive
トレースフラグを使用してトレースされているプロセスP1があるとフラグ(、つまりset_on_spawn
、send
、'receive'
)もP2に適用されます。ここで、トレーサT1がP1からのトレースを処理し、トレーサT2がP2からのトレースを処理するように、P2だけに新しいトレーサを作成したいと仮定します。 (これらは自動的に起因するset_on_spawn
フラグに継承されているので)(アーランは、プロセスごとに1つのだけのトレーサーを可能にするため)、そのために、私は、P2からの最初の設定解除のトレースフラグ(すなわちset_on_spawn
、send
、'receive'
)する必要があります次のようには、P2のそれらを再度設定:
% Unset trace flags on P2.
erlang:trace(P2Pid, false, [set_on_spawn, send, 'receive']),
% We might lose trace events at this instant which were raised
% by process P2 while un-setting the tracer on P2 and setting
% it again.
% Now set again trace flags on P2, directing the trace to
% a new tracer T2.
erlang:trace(P2Pid, true, [set_on_spawn, send, 'receive', {tracer, T2Pid}]),
トレーサー、原因競合状態のために失われる可能性があるプロセスP2によって提起されているトレースイベントの数を未設定ここに。
私の質問はこれです:これはトレースイベントを失うことなく達成できますか?
Erlangは、この「トレーサハンドオーバ」(つまりT1からT2の)をアトミックな方法で実行できる手段を提供していますか?
また、Erlang VMを一時停止することができますか?そうすることで、トレースを一時停止してトレースイベントが失われるのを防ぐことができますか?