当您调用dbg:tracer/0
时,类型的跟踪器将process
使用消息处理程序启动,该消息处理程序将所有跟踪消息发送到user
I/O 设备。您的远程 shell 的组长独立于user
I/O 设备,因此您的 shell 不会接收发送到user
.
允许您查看跟踪输出的一种方法是在服务器上设置跟踪端口,在单独的节点中设置跟踪客户端。如果你想从 node 跟踪foo
,首先 remsh 到它:
$ erl -sname bar -remsh foo
然后设置一个跟踪端口。在这里,我们在主机端口 50000 上设置了一个 TCP/IP 跟踪端口(使用您喜欢的任何端口,只要它对您可用):
1> dbg:tracer(port, dbg:trace_port(ip, 50000)).
接下来,像以前一样设置跟踪参数:
2> dbg:tp(my_api, handle, 2, []).
{ok, ...}
3> dbg:p(all, c).
{ok, ...}
然后退出remsh,启动一个没有remsh的节点:
$ erl -sname bar
在此节点上,启动连接到主机端口 50000 的 TCP/IP 跟踪客户端:
1> dbg:trace_client(ip, {"localhost", 50000}).
此 shell 现在将接收dbg
来自foo
. 在这里,我们用作"localhost"
主机名,因为该节点与服务器节点在同一主机上运行,但如果您的客户端在单独的主机上运行,则需要使用不同的主机名。
另一种方法更简单,但依赖于未记录的函数,因此将来可能会中断,即 remsh 到要跟踪的节点,就像您最初所做的那样,然后用于dbg:tracer/2
将dbg
输出发送到远程 shell 的组长:
1> dbg:tracer(process, {fun dbg:dhandler/2, group_leader()}).
{ok, ...}
2> dbg:tp(my_api, handle, 2, []).
{ok, ...}
3> dbg:p(all, c).
{ok, ...}
由于这依赖于dbg:dhandler/2
已导出但未记录的函数,因此无法保证它始终有效。
最后,由于您正在跟踪所有进程,请注意dbg
手册页中描述的潜在问题,并确保dbg:stop_clear().
在完成跟踪后调用。