Node.js,Cygwin和Socket.io走进一个吧... Node.js抛出ENOBUFS并且每个人都死了

时间:2011-01-11 13:26:46

标签: javascript dns cygwin node.js

我希望有人可以帮助我,我自己也没有多少运气。我在Cygwin上运行node.js版本0.3.1。我正在使用Connect和Socket.io。我似乎有一些随机的DNS问题,我还没弄明白。最终的结果是我服务器运行正常,但是当浏览器尝试连接到它时,初始HTTP请求工作,Socket.io连接,然后服务器死亡(下面的输出)。

我认为它与HTTP请求没有任何关系,因为服务器会向其发送大量数据,并且它正在接收请求并进行响应,直到我的连接将其终止。我已经google了,我发现最接近的是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)

修改

我在客户端连接获取信息后立即使用http.createClient访问LDAP服务器,这似乎是导致ENOBUFS的问题所在。我编辑了源to include && errno != ENOBUFS,它现在可以防止服务器死亡,但是现在LDAP请求不起作用。我不确定会导致这个问题的原因是什么。正如我所提到的,这是一个内部唯一的应用程序,因此我将/etc/resolv.conf中的DNS服务器设置为应用于主机的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 个答案:

答案 0 :(得分:9)

好的,我稍微挖了一下,在第二次编辑后,我在问题列表上找到了this bug

我没有说明是否在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问题的任何内容。

由于代码是在this commit中添加的,我在这里建议的唯一方法是尝试在添加代码之前从提交中提取树。因为之后的所有版本都有崩溃的代码。

如果可行,我建议你就Node.js问题列表提交另一个错误报告,尽管我今天晚些时候做了这个。

答案 1 :(得分:0)

很难回答这个问题,但主题为+1。

Node.js附带了一个测试套件以及主要版本,你运行它吗?我已成功构建节点,但因为我省略了OpenSSL,我的网络套接字测试失败了。安装/重建修复它。测试项目帮助我诊断问题。

建议按http://nodejs.org/#download进行“make test”。