Node.js, Cygwin и Socket.io идут в бар ... Node.js выбрасывает ENOBUFS и все умирают - PullRequest
48 голосов
/ 11 января 2011

Я надеюсь, что кто-то здесь может мне помочь, мне не повезло, что я сам это выясню. Я использую node.js версии 0.3.1 на Cygwin. Я использую Connect и Socket.io. Кажется, у меня возникли какие-то случайные проблемы с DNS или чем-то еще, я не совсем понял это. Конечным результатом является то, что сервер работает нормально, но когда браузер пытается подключиться к нему, первоначальный HTTP-запрос работает, Socket.io подключается, а затем сервер умирает (вывод ниже).

Я не думаю, что это имеет какое-либо отношение к HTTP-запросу, потому что сервер получает много данных, отправленных на него, и он получает запросы и отвечает до тех пор, пока мое соединение не прервало его. Я погуглил, и самое близкое, что я нашел, это неправильная настройка DNS. Это сетевая программа, предназначенная для запуска только во внутренней сети, поэтому я установил nameserver x.x.x.x в моем /etc/resolv.conf для внутреннего DNS. Я также добавил nameserver 8.8.8.8 в дополнение. Я не уверен, что еще проверить, но был бы признателен за любую помощь.

В node.exe.stackdump

Exception: STATUS_ACCESS_VIOLATION at eip=610C51B9
eax=00000000 ebx=00000001 ecx=00000000 edx=00000308 esi=00000000 edi=010FCCB0
ebp=010FCAEC esp=010FCAC4 program=\\?\E:\cygwin\usr\local\bin\node.exe, pid 3296, thread unknown (0xBEC)
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame     Function  Args
010FCAEC  610C51B9  (00000000, 00000000, 00000000, 00000000)
010FCBFC  610C5B55  (00000000, 00000000, 00000000, 00000000)
010FCCBC  610C693A  (FFFFFFFF, FFFFFFFF, 750334F3, FFFFFFFE)
010FCD0C  61027CB2  (00000002, F4B994D5, 010FCE64, 00000002)
010FCD98  76306B59  (00000002, 010FCDD4, 763069A4, 00000002)
End of stack trace

Выход узла:

    node.js:50
    throw e; // process.nextTick error, or 'error' event on first tick
    ^
Error: ENOBUFS, No buffer space available
    at doConnect (net.js:642:19)
    at net.js:803:9
    at dns.js:166:30
    at IOWatcher.callback (dns.js:48:15)

EDIT

Я подключаюсь к серверу LDAP, используя http.createClient сразу после подключения клиента для получения информации, и, похоже, именно в этом и заключается проблема, вызывающая ENOBUFS. Я отредактировал источник , включив в него && errno != ENOBUFS, который теперь предотвращает смерть сервера, однако теперь LDAP-запрос не работает. Я не уверен, в чем проблема, которая могла бы вызвать это все же. Как я уже упоминал, это только внутреннее приложение, поэтому я установил DNS-серверы в /etc/resolv.conf на DNS-серверы, которые применяются к хост-компьютеру. Не уверены, является ли это частью проблемы?

РЕДАКТИРОВАТЬ 2

Вот некоторые результаты из gdb --args ./node_g --debug ../myscript.js. Однако я не уверен, связано ли это с ENOBUFS, так как, похоже, он отключается сразу после соединения с Socket.io

    [New thread 672.0x100]
Error: dll starting at 0x76e30000 not found.
Error: dll starting at 0x76250000 not found.
Error: dll starting at 0x76e30000 not found.
Error: dll starting at 0x76f50000 not found.
[New thread 672.0xc90]
[New thread 672.0x448]
debugger listening on port 5858
[New thread 672.0xbf4]
14 Jan 18:48:57 - socket.io ready - accepting connections
[New thread 672.0xed4]
[New thread 672.0xd68]
[New thread 672.0x1244]
[New thread 672.0xf14]
14 Jan 18:49:02 - Initializing client with transport "websocket"
assertion "b[1] == 0" failed: file "../src/node.cc", line 933, function: ssize_t
 node::DecodeWrite(char*, size_t, v8::Handle<v8::Value>, node::encoding)

Program received signal SIGABRT, Aborted.
0x7724f861 in ntdll!RtlUpdateClonedSRWLock ()
   from /cygdrive/c/Windows/system32/ntdll.dll
(gdb) backtrace
#0  0x7724f861 in ntdll!RtlUpdateClonedSRWLock ()
   from /cygdrive/c/Windows/system32/ntdll.dll
#1  0x7724f861 in ntdll!RtlUpdateClonedSRWLock ()
   from /cygdrive/c/Windows/system32/ntdll.dll
#2  0x75030816 in WaitForSingleObjectEx ()
   from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3  0x0000035c in ?? ()
#4  0x00000000 in ?? ()
(gdb)

Ответы [ 2 ]

9 голосов
/ 14 января 2011

ОК, я немного покопался, и после вашего второго редактирования я обнаружил эту ошибку в списке проблем.

Я не утверждаю, встречалось ли это в Cygwin или нет, но ошибка, с которой он сталкивается, приводит к следующему коду:

  uint16_t * twobytebuf = new uint16_t[buflen];

  str->Write(twobytebuf, 0, buflen, String::HINT_MANY_WRITES_EXPECTED);

  for (size_t i = 0; i < buflen; i++) {
    unsigned char *b = reinterpret_cast<unsigned char*>(&twobytebuf[i]);
    assert(b[1] == 0); // this assertion fails
    buf[i] = b[0];
  }

Из того, что я могу прочитать (с моим ржавым C), он преобразуется, создаст новый массив uin16 и запишет содержимоеиз строки V8 в их, тогда он будет гарантировать, что приведение не записывает никаких значений за пределами диапазона 0 - 255, и это именно то, что здесь не так.

Я не смог найти ничего относительно того, является ли этоПроблема V8 или нет.

Поскольку код был добавлен в этот коммит , единственное, что я могу предложить здесь, это попытаться извлечь дерево из коммита до добавления кода.Поскольку все версии после этого имеют код сбоя.

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

0 голосов
/ 13 января 2011

Очень трудно ответить на этот вопрос, но +1 за строку темы.

Node.js поставляется с набором тестов вместе с основной сборкой, вы это запускаете?Я успешно построил узел, но из-за того, что я опустил OpenSSL, мои тесты веб-сокетов провалились.Установить / восстановить исправить это.Тестовые проекты помогли мне диагностировать проблему.

предложите сделать "make test", как описывает http://nodejs.org/#download.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...