首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不输出erlang示踪器

不输出erlang示踪器
EN

Stack Overflow用户
提问于 2022-01-28 12:36:26
回答 1查看 44关注 0票数 0

我有一个模块my_api,它的函数是对牛仔的请求句柄/2进行回调,所以当我发出如下一些http请求时:

代码语言:javascript
复制
curl http://localhost/test

对于我的应用程序,这个函数被调用了,并且它工作正常,因为我在终端中得到了一个响应。

但是,在另一个终端中,我使用remsh将应用程序附加到应用程序中,并尝试使用这样的dbg模块跟踪对该函数的调用:

代码语言:javascript
复制
dbg:tracer().
dbg:tp(my_api, handle, 2, []).
dbg:p(all, c).

我期望在另一个终端上向api发出http请求之后,调用my_api:handle/2函数,然后在附加到节点终端的函数中获得有关此调用的一些信息(至少函数参数),但在该节点终端中没有得到任何信息。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-30 19:12:03

调用dbg:tracer/0时,使用消息处理程序启动process类型的跟踪程序,该处理程序向user I/O设备发送所有跟踪消息。远程shell的组领导独立于user I/O设备,因此您的shell不会接收发送给user的输出。

允许您查看跟踪输出的一种方法是在服务器上设置跟踪端口,并在单独的节点中设置跟踪客户端。如果您想要从节点foo中获得跟踪,首先要对其进行以下操作:

代码语言:javascript
复制
$ erl -sname bar -remsh foo

然后设置一个跟踪端口。在这里,我们在主机端口50000上设置了一个TCP/IP跟踪端口(只要您可以使用它,就可以使用您喜欢的任何端口):

代码语言:javascript
复制
1> dbg:tracer(port, dbg:trace_port(ip, 50000)).

接下来,像前面一样设置跟踪参数:

代码语言:javascript
复制
2> dbg:tp(my_api, handle, 2, []).
{ok, ...}
3> dbg:p(all, c).
{ok, ...}

然后退出remsh,然后启动一个节点,而不使用remsh:

代码语言:javascript
复制
$ erl -sname bar

在此节点上,启动连接到主机端口50000的TCP/IP跟踪客户端:

代码语言:javascript
复制
1> dbg:trace_client(ip, {"localhost", 50000}).

这个shell现在将从dbg接收来自foo的跟踪消息。在这里,我们使用"localhost"作为主机名,因为此节点与服务器节点运行在同一台主机上,但是如果客户端在单独的主机上运行,则需要使用不同的主机名。

另一种方法更简单,但依赖于一个无文档的函数,因此在将来可能会中断,它是重定向到要跟踪的节点,但是使用dbg:tracer/2dbg输出发送给远程shell的组领导:

代码语言:javascript
复制
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().

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70893910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档