在使用dbg跟踪我的模块时,我遇到了如何收集诸如spawn,exit,register,unregister,link,unlink,getting_linked,getting_unlinked等消息的问题,这些消息是erlang:trace允许的,但仅适用于那些进程这是从我的模块直接产生的? 作为一个例子,当我在一些模块函数中调用io:format时,我不需要知道模块创建哪些进程。有人知道如何解决这个问题吗?
答案 0 :(得分:0)
简短回答:
一种方法是查看调用消息,然后查看 spawn 消息。
答案很长:
我不是 dbg 的专家。原因是我一直在使用(imho更好,更安全甚至更方便)替代方案: pan ,来自https://gist.github.com/gebi/jungerl/tree/master/lib/pan
API总结为in the html doc。
使用 pan:start ,您可以跟踪指定接收所有跟踪消息的回调模块。然后你的回调模块可以处理它们,例如跟踪ETS中的进程或传递给每个调用的状态数据。 跟踪消息的格式在 pan:scan 。
下指定有关回调模块的示例,您可以查看 src / cb _ * .erl 。
现在问你的问题: 使用 pan ,您可以在您的favourit模块中跟踪流程处理和调用,如下所示:
pan:start({ip, CallbackModule}, Node, all, [procs,call], {Module}).
其中Module是模块的名称(在本例中为:sptest) 然后回调模块(在这种情况下:cb_write)可以查看同一进程中调用消息后面的 spawn 消息,例如:
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 更安全。