2011-01-11 38 views
48

Espero que alguien aquí pueda ayudarme, no estoy teniendo mucha suerte en descifrar esto por mi cuenta. Estoy ejecutando node.js versión 0.3.1 en Cygwin. Estoy usando Connect y Socket.io. Parece que tengo algunos problemas aleatorios con DNS o algo, no lo he descubierto del todo. El resultado final es que el servidor funciona correctamente, pero cuando un navegador intenta conectarse a él, la solicitud HTTP inicial funciona, Socket.io se conecta y luego el servidor muere (se muestra a continuación).Node.js, Cygwin y Socket.io entran en un bar ... Node.js arroja ENOBUFS y todo el mundo muere

No creo que tenga nada que ver con la solicitud HTTP porque el servidor obtiene muchos datos publicados en ella, y recibía solicitudes y respondía hasta que mi conexión lo mató. Busqué en Google y lo más parecido que he encontrado es que el DNS está configurado incorrectamente. Es un programa de red destinado a ejecutarse solo en una red interna, así que configuré nameserver x.x.x.x en mi /etc/resolv.conf en el DNS interno. También he agregado nameserver 8.8.8.8 además. No estoy seguro de qué más comprobar, pero estaría agradecido de cualquier ayuda.

En 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 

Resultado del nodo:

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) 

EDITAR

estoy golpeando un servidor LDAP utilizando http.createClient inmediatamente después de un cliente se conecta a obtener información, y que parece donde el problema es que está causando ENOBUFS. He editado la fuente to include && errno != ENOBUFS que ahora impide que el servidor se muera, pero ahora la solicitud LDAP no funciona. No estoy seguro de cuál es el problema que causaría eso sin embargo. Como mencioné, esta es una aplicación interna única, por lo que configuro los servidores DNS en /etc/resolv.conf en los servidores DNS que se están aplicando a la máquina host. ¿No estoy seguro de si esto es parte del problema?

EDIT 2

He aquí alguna salida de gdb --args ./node_g --debug ../myscript.js. No estoy seguro de si esto está relacionado con ENOBUFS, sin embargo, ya que parece estar desconectar inmediatamente después de la conexión con 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) 
+5

Si no publica el código en sí, bien, puede ser un poco difícil adivinar cuál es el problema. – Pointy

+0

El código no es el problema. Estoy actualizando la pregunta con más información. –

+28

+1 para el tema – WarrenFaith

Respuesta

9

Bien, cavé un poco, y después de su segunda edición encontré this bug en la lista de problemas.

que no indica si esta se encuentra bajo Cygwin o no, pero el error que está golpeando conduce hacia esta porción de código:

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]; 
    } 

De lo que puedo leer (con mi oxidado C) se convertirá creará una nueva matriz uin16 y escribirá el contenido de la cadena V8 en su, entonces se asegurará de que la conversión no haya escrito ningún valor fuera del rango de 0 - 255, y eso es exactamente lo que falla aquí.

No he podido encontrar nada con respecto a si esto es un problema de V8 o no.

Dado que el código se añadió en this commit, lo único que puedo sugerir aquí es tratar de tirar el árbol de un comprometerse antes de añadir el código. Como todas las versiones posteriores tienen el código bloqueado.

Si eso funciona, le recomendaría que presente otro informe de errores en la lista de problemas de Node.js, aunque lo hice más tarde este día.

+0

Ese compromiso fue hace un año y medio, aunque no sé si los módulos/mi código incluso funcionarían en ese entorno. ¿Es posible simplemente cambiar el código en una versión más nueva? –

+0

Supongo que sería posible, pero necesitaría algunas pruebas y mi conocimiento de C++ V8 y C++ es muy limitado, sería mejor publicarlo en el grupo de Google Node.js o incluso entrar en # node.js en freenode, ya que el rastreador de problemas en GitHub es ignorado la mayor parte del tiempo. –

+6

¡Diablos! ¡Una suposición de little-endian codificada! ¡Ese código necesita ser retirado y disparado! – slebetman

0

muy difícil responder a este, pero 1 de la línea de asunto.

Node.js viene con un conjunto de pruebas junto con la compilación principal, ¿has ejecutado eso? Construí el nodo con éxito pero, debido a que omití OpenSSL, mis pruebas de socket web estaban fallando. Instalar/reconstruir lo arregló. Los proyectos de prueba me ayudaron a diagnosticar el problema.

sugieren hacer "hacer prueba" como http://nodejs.org/#download describe.