Подтвердить что ты не робот

Node.js, Cygwin и Socket.io входят в панель... Node.js выбрасывает ENOBUFS, и все умирают

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

Я не думаю, что это имеет какое-либо отношение к HTTP-запросу, потому что сервер получает много данных, отправленных на него, и он получал запросы и отвечал до моего соединения, которое его убило. Я искал googled, и самое близкое, что я нашел, - это 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 Выход:

    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)

ИЗМЕНИТЬ

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

EDIT 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)
4b9b3361

Ответ 1

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

Я не указываю, было ли это встречено в 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 или нет.

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

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

Ответ 2

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

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

предлагает сделать "make test" как http://nodejs.org/#download.