在dtrace中获取Erlang消息的消息内容

时间:2019-09-20 15:20:21

标签: erlang trace dtrace

我正在尝试使用Erlang和dtrace,并且想知道是否可以获取两个Erlang进程之间交换的消息内容。我尤其对message-sendmessage-receive探测感兴趣。

我看着erlang_dtrace.dmessages.d来看看是否可行,但是我没有取得任何进展。

有没有一种方法可以实现这一目标。如果没有,还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

在此处的第242行使用了消息接收探针:

https://github.com/erlang/otp/blob/4d0c23bd19f138e4fcfedd11283636e96d6bbc4f/erts/emulator/beam/msg_instrs.tab#L227

(请注意,只有当 探针本身已启用,这由前面的宏确定 227。)

有趣的是,该消息本身并未公开,这就是为什么您无法对其进行跟踪的原因。但是,我认为对VM进行补丁以实现您想要的操作是可行的。您需要将消息作为字符串呈现到缓冲区中,并公开该缓冲区的地址。这个习语的现有示例是

https://github.com/erlang/otp/blob/4d0c23bd19f138e4fcfedd11283636e96d6bbc4f/erts/emulator/beam/global.h#L1603