2016-06-13 13 views
0

Erlangのトレーサに関する質問と、トレースイベントを失うことなくこれらのスイッチをオン/オフに切り替える方法を教えてください。トレースイベントを失うことなくErlangトレーサを停止して起動する

erlang:trace(P1Pid, true, [set_on_spawn, send, 'receive', {tracer, T1Pid}]) 

set_on_spawnフラグが指定されているので、(サブ)プロセスP2は、P1によって生成されると、同じ:私は同様に、sendreceiveトレースフラグを使用してトレースされているプロセスP1があるとフラグ(、つまりset_on_spawnsend'receive')もP2に適用されます。ここで、トレーサT1がP1からのトレースを処理し、トレーサT2がP2からのトレースを処理するように、P2だけに新しいトレーサを作成したいと仮定します。 (これらは自動的に起因するset_on_spawnフラグに継承されているので)(アーランは、プロセスごとに1つのだけのトレーサーを可能にするため)、そのために、私は、P2からの最初の設定解除のトレースフラグ(すなわちset_on_spawnsend'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を一時停止することができますか?そうすることで、トレースを一時停止してトレースイベントが失われるのを防ぐことができますか?

答えて

0

私はこの問題をより深く見てきたし、半好都合な(下記の点を参照)部分的な回避策を見つけた可能性があります。 Erlangのドキュメントを読んだ後、私はerlang:suspend_process/1erlang:resume_process/1 BIFを見つけました。

% Suspend process P2. According to the Erlang docs, this function 
% blocks the caller (i.e. the current tracer) until P2 is suspended. 
% This way, we do not lose trace events. 
erlang:suspend_process(P2Pid), 

% Unset trace flags on P2. 
erlang:trace(P2Pid, false, [set_on_spawn, send, 'receive']), 

% We should not lose any trace events from P2, since it is 
% currently suspended, and therefore cannot generate any. 
% However, we can still lose receive trace events that are 
% generated as a result of other processes sending messages 
% to P2. 

% 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}]), 

% Finally, resume process P2, so that we can receive any trace 
% messages generated by P2 on the new tracer T2. 
erlang:resume_process(P2Pid). 

私だけこの方法を使用して、3つの懸念は以下の通りです:

  1. erlang:suspend_process/1erlang:resume_process/1のためのErlangのドキュメントが明示的にこれらがにしていると述べているこれらの2を使用して、私はそうのような目的の動作を実現することができますのデバッグの目的にのみ使用されます。私の質問は、プロセスP2が中断されない限り、トレーサT1からトレーサT2に切り替わる間にトレースイベントを失う危険に直面していない限り、これらを本番で使用できないのはなぜですか?
  2. 私たちは実際にシステムを使いこなしています(つまり私たちはそのスケジューリングを妨害しています)。以前に中断したプロセスでerlang:resume_process/1に電話するのを忘れることはできますが、これに関連してリスクはありますか?
  3. さらに重要なことに、プロセスP2の処理を防ぐことはできますが、他のプロセスがP2にメッセージを送信することを防ぐことはできません。これらのメッセージは、トレースを切り替える際に失われる可能性がある{trace, Pid, receive, ...}トレースイベントになります。これを避ける方法はありますか?

NB:以前に処理Pにより中断されたプロセスPは(erlang:suspend_process/1を呼び出すもの)ダイ 'Pがあれば自動的にが再開されます'。

関連する問題