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

Posted

技术标签:

【中文标题】在dtrace中获取Erlang消息的消息内容【英文标题】:Obtain message content of Erlang messages in dtrace 【发布时间】:2019-09-20 15:20:21 【问题描述】:

我在用Erlang和dtrace做实验,有兴趣知道两个Erlang进程之间交换的消息内容是否可以获取。特别是,我对message-sendmessage-receive 探测器感兴趣。

我查看了erlang_dtrace.d 和messages.d 看看这是否可行,但我无法取得任何进展。

有没有办法实现这一点。如果没有,还有其他选择吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在dtrace中获取Erlang消息的消息内容的主要内容,如果未能解决你的问题,请参考以下文章

Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!

Erlang 细节记录

如果代码不为0,则无法获取erlang escript退出代码

linux下安装RabbitMQ和Erlang

SpringCloud------消息总线Bus实现配置中心自动获取git中xml配置

Linux下获取消息队列的信息