getaddrinfo не может разрешить адрес в файле hosts при использовании mocha

  • Node.js 0.10.26
  • OS X 10.9.2 (также на бродячей коробке Ubuntu)

В двух разных модулях моей системы, когда я запускаю тесты с использованием мокко, я получаю эту ошибку:

{ [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? и почему это происходит со мной только тогда, когда я запускаю тесты с мокко, а не когда я запускаю свои службы и нажимаю их вручную?

Если вы хотите увидеть соответствующий код node.js, который получает ошибки, не стесняйтесь исследовать mongodb и запросить, потому что мое использование похоже на их примеры.


person joshuten    schedule 23.04.2014    source источник
comment
Похоже, вы забыли где-то закрыть некоторые файловые дескрипторы. проверить: github.com/mikeal/request/issues/699   -  person Daniel    schedule 24.04.2014


Ответы (2)


Попробуйте преобразовать arg1 в int:

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

Это проблема, которую я заметил недавно, может объяснить, почему вы получаете действительно большие числа. IIRC, это связано с тем, что в ядре от arg0 до arg12 хранятся в uint64_t. Я не помню путь кода в libdtrace, чтобы фактически выполнить приведение.

person Samuel Gosselin    schedule 25.04.2014
comment
Я пробовал это, но я все еще получаю странные результаты. Значения этих аргументов, по-видимому, зависят от того, сколько я распечатываю: arg0 arg1 arg2 дает значения, отличные от arg0 arg1. Вы знаете что-нибудь, что я мог бы прочитать, чтобы узнать больше об этом? - person joshuten; 25.04.2014
comment
Вот суть того, что я пытаюсь сделать прямо сейчас - person joshuten; 25.04.2014

Большое количество arg1 связано с DTrace. Оптимизация хвостового вызова. Вы можете проверить исходный код getaddrinfo, если это возможно (если нет, используйте команду disassemble инструмента gdb), и вы обнаружите, что getaddrinfo может вызывать другую функцию.

person Nan Xiao    schedule 28.04.2014