挂起Erlang进程
我通过调用某个进程的BIF挂起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的所有权
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
的所有权转移给它,这样生成的配置将是由tracerTrc\u p
跟踪的进程p
,Q
由Trc\u Q
跟踪的进程p
但是,Erlang最多允许每个进程使用一个跟踪程序,因此我无法通过调用Trc\u Q
中的Erlang:trace(Pid\u Q,true,…)
来实现上述配置。唯一可行的方法是分两步进行:
TracerTrc\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文档明确表示这些仅用于调试目的。你知道为什么会这样吗