在dtrace中获取Erlang消息的消息内容
Posted
技术标签:
【中文标题】在dtrace中获取Erlang消息的消息内容【英文标题】:Obtain message content of Erlang messages in dtrace 【发布时间】:2019-09-20 15:20:21 【问题描述】:我在用Erlang和dtrace做实验,有兴趣知道两个Erlang进程之间交换的消息内容是否可以获取。特别是,我对message-send
和message-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语言高级编程之使用消息队列实现进程间通信!重点内容!!!
如果代码不为0,则无法获取erlang escript退出代码