0
  • Node.js 0.10.26
  • OS X 10.9.2(也在 ubuntu vagrant box 上)

在我系统上的两个不同模块中,当我使用 mocha 运行测试时,我收到此错误:

{ [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' }

这通常意味着我试图解析一个不存在的主机。我尝试使用带有此脚本的 dtrace 来发现问题(我发现并稍作修改):

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN
{
    printf("%-20s  %-12s %s\n", "TIME", "LATENCY(ms)", "HOST");
}

pid$target::getaddrinfo:entry
{
    self->host = copyinstr(arg0);
    self->start = timestamp;
}

pid$target::getaddrinfo:return
/self->start/
{
    printf("%d", arg1);
    this->delta = (timestamp - self->start) / 1000000;
    printf("%-20Y  %-12d %s\n", walltimestamp, this->delta, self->host);
    self->host = 0;
    self->start = 0;
}

使用它,我可以看到我的测试命中的每个主机要么在我的主机文件中,要么是我的主机名。printf("%d", arg1);打印出(我认为)函数的返回值。不幸的是,我看到的返回值是一个很大的数字,而不是0或者-1 应该是

所以我的 dtrace 脚本可能有问题,但这并不能解释我更大的问题:

data-proxy当我的 hosts 文件包含时,为什么没有解析主机127.0.0.1 data-proxy?为什么这只会发生在我使用 mocha 运行测试时而不是当我运行我的服务并手动点击它们时?

如果您想查看得到错误的相关 node.js 代码,请随时检查 mongodb 和 request,因为我的用法看起来像他们的示例。

4

2 回答 2

0

arg1 的数量很大是由于DTrace 的 Tail-call Optimization。可以的话可以查看getaddrinfo源码(如果不行,请使用gdb工具disassemble命令),你会发现getaddrinfo可能会调用其他函数。

于 2014-04-28T01:58:56.253 回答
0

尝试将arg1转换为int

printf("%d\n", (int) arg1);

这是我最近发现的一个问题,它可以解释为什么你会得到非常大的数字。IIRC,这是因为在内核中arg0arg12存储在 uint64_t 中。我不记得在 libdtrace 中有一个代码路径来实际进行转换。

于 2014-04-25T11:24:11.980 回答