0

在使用 dbg 跟踪我的模块时,我遇到了如何收集消息的问题,例如 spawn、exit、register、unregister、link、unlink、getting_linked、getting_unlinked,这些是 erlang:trace 允许的,但仅限于那些产生的进程直接从我的模块?例如,当我在某些模块函数中调用 io:format 时,我不需要知道 io 模块创建了哪些进程。有谁知道如何解决这个问题?

4

1 回答 1

0

简短的回答:

一种方法是查看呼叫消息,然后查看生成消息。

长答案:

我不是dbg的专家。原因是我一直在使用(恕我直言,更好,更安全,甚至更方便)替代方案:pan,来自https://gist.github.com/gebi/jungerl/tree/master/lib/pan

API在 html doc 中进行了总结。

使用pan:start您可以跟踪指定接收所有跟踪消息的回调模块。然后您的回调模块可以处理它们,例如跟踪 ETS 中的进程或传递给每个调用的状态数据。跟踪消息的格式在pan:scan下指定。

对于回调模块的示例,您可以查看src/cb_*.erl

现在回答您的问题:使用pan您可以跟踪您最喜欢的模块中的流程处理和调用,如下所示:

pan:start({ip, CallbackModule}, Node, all, [procs,call], {Module}).

其中 Module 是您的模块的名称(在本例中:sptest) 然后回调模块(在本例中:cb_write)可以查看在同一进程中调用消息之后的生成消息,例如:

32      - {call,{<6761.194.0>,{'fun',{shell,<node>}}},{sptest,run,[[97,97,97]]},{1332,247999,200771}}
33      - {spawn,{<6761.194.0>,{'fun',{shell,<node>}}},{{<6761.197.0>,{io,fwrite,2}},{io,fwrite,[[77,101,115,115,97,103,101,58,32,126,115,126,110],[[97,97,97]]]}},{1332,247999,200805}}

由于pan也使用与dbg相同的跟踪后端,因此也可以使用 Erlang 跟踪 BIF-s 收集跟踪消息(和信息),但pan更安全。

于 2012-03-20T13:14:25.513 回答