使用 mocha 时 getaddrinfo 无法解析主机文件中的地址
Posted
技术标签:
【中文标题】使用 mocha 时 getaddrinfo 无法解析主机文件中的地址【英文标题】:getaddrinfo fails to resolve address in hosts file when using mocha 【发布时间】:2014-04-23 20:20:13 【问题描述】: 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);
打印出(I think)函数的返回值。不幸的是,我看到的返回值是一个很大的数字,而不是 0
或 -1
like it should be。
所以我的 dtrace 脚本可能有问题,但这并不能解释我更大的问题:
当我的主机文件包含127.0.0.1 data-proxy
时,为什么主机data-proxy
没有解析?为什么这种情况只会在我使用 mocha 运行测试时发生,而不是在我运行我的服务并手动点击它们时发生?
如果您想查看得到错误的相关 node.js 代码,请随时检查 mongodb 并请求,因为我的用法看起来像他们的示例。
【问题讨论】:
看起来可能是您忘记在某处关闭某些文件句柄。签出:github.com/mikeal/request/issues/699 【参考方案1】:尝试在 int 中投射 arg1:
printf("%d\n", (int) arg1);
这是我最近发现的一个问题,它可以解释为什么你会得到非常大的数字。 IIRC,这是因为在内核中 arg0 到 arg12 存储在 uint64_t 中。我不记得在 libdtrace 中实际执行转换的代码路径。
【讨论】:
我试过了,但我仍然得到奇怪的结果。这些 args 的值似乎取决于我打印出的数量:arg0 arg1 arg2 给出的值与 arg0 arg1 不同。您是否知道我可以阅读以了解更多信息? 这是我现在正在尝试的gist【参考方案2】:arg1 的大数字是由于DTrace's Tail-call Optimization。
可以的话可以查看getaddrinfo源码(如果不行,请使用gdb
工具的disassemble
命令),你会发现getaddrinfo可能会调用其他函数。
【讨论】:
以上是关于使用 mocha 时 getaddrinfo 无法解析主机文件中的地址的主要内容,如果未能解决你的问题,请参考以下文章
带有 systemd 的 getaddrinfo() API
Nodejs错误:getaddrinfo ENOENT [重复]
使用 Promise 并跳过代码时,Mocha 测试超时,为啥?
无法使用 python 连接到 *.onion 站点(<urlopen 错误 [Errno 11001] getaddrinfo failed>)