我有一个模块my_api,它的函数是对牛仔的请求句柄/2进行回调,所以当我发出如下一些http请求时:
curl http://localhost/test对于我的应用程序,这个函数被调用了,并且它工作正常,因为我在终端中得到了一个响应。
但是,在另一个终端中,我使用remsh将应用程序附加到应用程序中,并尝试使用这样的dbg模块跟踪对该函数的调用:
dbg:tracer().
dbg:tp(my_api, handle, 2, []).
dbg:p(all, c).我期望在另一个终端上向api发出http请求之后,调用my_api:handle/2函数,然后在附加到节点终端的函数中获得有关此调用的一些信息(至少函数参数),但在该节点终端中没有得到任何信息。我遗漏了什么?
发布于 2022-01-30 19:12:03
调用dbg:tracer/0时,使用消息处理程序启动process类型的跟踪程序,该处理程序向user I/O设备发送所有跟踪消息。远程shell的组领导独立于user I/O设备,因此您的shell不会接收发送给user的输出。
允许您查看跟踪输出的一种方法是在服务器上设置跟踪端口,并在单独的节点中设置跟踪客户端。如果您想要从节点foo中获得跟踪,首先要对其进行以下操作:
$ 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"作为主机名,因为此节点与服务器节点运行在同一台主机上,但是如果客户端在单独的主机上运行,则需要使用不同的主机名。
另一种方法更简单,但依赖于一个无文档的函数,因此在将来可能会中断,它是重定向到要跟踪的节点,但是使用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 man page中描述的潜在问题,并且始终确保在完成跟踪时调用dbg:stop_clear().。
https://stackoverflow.com/questions/70893910
复制相似问题