在我系统的两个不同模块中,当我使用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脚本可能有问题,但这并不能解释我的更大问题:
当我的主机文件包含data-proxy
时,为什么主机127.0.0.1 data-proxy
未解析?为什么这只发生在我用mocha运行测试时,而不是在我运行服务并手动点击它时?
如果您想查看获取错误的相关node.js代码,请随时检查mongodb和请求,因为我的用法看起来像他们的示例。
答案 0 :(得分:0)
尝试在 int 中投射 arg1 :
printf("%d\n", (int) arg1);
这是我最近发现的一个问题,它可以解释为什么你会得到真正的大数字。 IIRC,这是因为在内核 arg0 到 arg12 存储在uint64_t中。我不记得libdtrace中的代码路径来实际进行演员。
答案 1 :(得分:0)
大量的arg1归因于DTrace's Tail-call Optimization。
如果可能,您可以检查getaddrinfo源代码(如果没有,请使用gdb
工具disassemble
命令),您会发现getaddrinfo可能会调用其他函数。