挂起Erlang进程

挂起Erlang进程,erlang,trace,verification,Erlang,Trace,Verification,我通过调用某个进程的BIFErlang:trace(Pid\u p,true,[set\u on\u spawn,procs,send,'receive'])来跟踪一个Erlang进程,比如说,p。根据Erlang文档,后一个进程成为P的跟踪程序,我将其称为Trc\u Q 现在假设,该进程p产生了一个新进程Q。由于在上面对erlang:trace/3的调用中指定了标志set\u on\u spawn,因此Q也将由Trc\u P自动跟踪 我想生成一个新的跟踪器,Trc\u Q,并将跟踪Q的所有权

我通过调用某个进程的BIF
Erlang:trace(Pid\u p,true,[set\u on\u spawn,procs,send,'receive'])来跟踪一个Erlang进程,比如说,
p
。根据Erlang文档,后一个进程成为
P
的跟踪程序,我将其称为
Trc\u Q

现在假设,该进程
p
产生了一个新进程
Q
。由于在上面对
erlang:trace/3
的调用中指定了标志
set\u on\u spawn
,因此
Q
也将由
Trc\u P
自动跟踪


我想生成一个新的跟踪器,
Trc\u Q
,并将跟踪
Q
的所有权转移给它,这样生成的配置将是由tracer
Trc\u p
跟踪的进程
p
Q
Trc\u Q
跟踪的进程
p

但是,Erlang最多允许每个进程使用一个跟踪程序,因此我无法通过调用
Trc\u Q
中的
Erlang:trace(Pid\u Q,true,…)
来实现上述配置。唯一可行的方法是分两步进行:

  • Tracer
    Trc\u Q
    调用
    erlang:trace(Pid\u Q,false,…)
    停止
    Trc\u P
    跟踪
    Q
  • Trc\u Q
    再次调用
    erlang:trace(Pid\u Q,true,…)
    以开始跟踪
    Q
  • 在上述步骤1.2.之间的时间跨度内,通过进程
    Q
    跟踪事件可能会丢失,因为此时没有附加跟踪程序。缓解这种情况的一种方法是执行以下操作:

  • 通过调用
    Trc\u Q
    中的
    erlang:Suspend\u process(Pid\u Q)
    来暂停进程
    Q
    (请注意,根据erlang文档,
    Trc\u Q
    将保持阻塞状态,直到
    Q
    最终被虚拟机暂停)
  • Trc\u Q
    调用
    erlang:trace(Pid\u Q,false,…)
    停止
    Trc\u P
    跟踪
    Q
  • Trc\u Q
    再次调用
    erlang:trace(Pid\u Q,true,…)
    以开始跟踪
    Q
  • 最后,
    Trc\u Q
    调用
    erlang:resume\u进程(Pid\u Q)
    ,以便
    Q
    可以继续执行
  • 据我所知,当
    Q
    被挂起时,发送给它的消息被排队,当恢复时,
    Trc\u Q
    相应地接收
    {trace,Pid\u Q,receive,Msg}
    跟踪事件,没有任何损失

    我有一个限制条件,导致我考虑暂停/恢复进程:我不能修改
    p
    Q
    的代码,因此插入
    receive
    表达式来阻止所述进程是不可能的

    但是,我对使用suspend/resume犹豫不决,因为Erlang文档明确表示这些仅用于调试目的。你知道为什么会这样吗