使用erlang:trace_delivered / 1

时间:2018-07-19 10:31:55

标签: erlang tracing

我试图了解erlang:trace_delivered/1的确切语义,以确定此功能是否可以适当地用于解决我当前面临的问题。问题如下。

假设有一个跟踪进程X,一个跟踪程序Y跟踪X,以及第三个进程Z。跟踪器Y最初正在跟踪X。流程Z的任务是通过调用Y来阻止X跟踪erlang:trace(X, false)Z正在运行时,此呼叫任意进行。此后,X还将向跟踪器Z发出一条特殊消息stopped,该消息向Y发出信号,通知Y实际上已阻止Z进行跟踪Y

我想保证特殊的X消息在所有其他跟踪消息都已经交付到stopped之后,会被交付到Y的邮箱。据我所知,Erlang不保证不同进程发送到单个进程的消息顺序。具体来说,在我的情况下,这意味着跟踪器Y可以接收Y发出的stopped由于跟踪{{1 }}。我读到有关Z的内容,并计划在X的实现中使用以下代码解决我的问题:

erlang:trace_delivered/1

docs(下面引用)中提供了一个类似的示例:

  

示例:进程Z是Tracee,端口... erlang:trace(X, false), Ref = erlang:trace_delivered(X), receive {trace_delivered, X, Ref} -> Y ! stopped end. ... 是Tracer,进程AB的端口所有者。 C想要在B退出时关闭C。为了确保跟踪不会被截断,B可以在A退出时调用C,并在关闭erlang:trace_delivered(A)之前等待消息A

我的示例在两个方面与文档中的示例不同:

  1. 流程{trace_delivered, A, Ref}知道调用B之前C的确切执行点 ;就我而言,我不知道Aerlang:trace_delivered(A)调用时X所在的地方。
  2. 与流程erlang:trace_delivered(X)相比,我的流程Z在调用C之前关闭了对Z的跟踪。

在这种情况下X的语义是什么?

  1. 是否仍保证进程erlang:trace_delivered(X)已收到erlang:trace_delivered/1,在所有跟踪消息都已传递到跟踪器{trace_delivered, X, Ref}之后?
  2. Z是否自动跟踪执行迹线Y的点才能提供上述保证?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您对消息的顺序是正确的。如果进程A向进程B发送了多个消息,则将保证它们按顺序到达。如果A向进程BC发送多条消息,则只能保证每个进程的消息顺序。例如:

  • A发送B消息1
  • A发送C消息2
  • A发送B消息3
  • A发送C消息4

在这种情况下,唯一的保证是B将在消息3之前接收消息1,而C将在消息4之前接收消息2。

要回答您的问题:

  1. 否,如果在生成其他跟踪事件之前调用erlang:trace_delivered/1,则这些消息将在以后到达。该文档仅保证先前的跟踪消息在{trace_delivered, ...}之前发送:

      

    当确保在跟踪erlang:trace_delivered(Tracee)时,Trace到达到达跟踪点的所有跟踪消息时,都将{trace_delivered,Tracee,Ref}消息发送到erlang:trace_delivered(Tracee)的调用者。

  2. erlang:trace_delivered/1周围的保证始终成立。但这不能保证{trace_delivered, ...}始终是最后一条消息。