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

A W*_* It 48 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
Run Code Online (Sandbox Code Playgroud)

节点输出:

    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)
Run Code Online (Sandbox Code Playgroud)

编辑

我在http.createClient客户端连接获取信息后立即使用LDAP服务器,这似乎是导致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)
Run Code Online (Sandbox Code Playgroud)

Ivo*_*zel 9

好的,我挖了一下,在第二次编辑后,我在问题列表中发现了这个错误.

我没有说明这是否是在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];
  }
Run Code Online (Sandbox Code Playgroud)

从我能读到的(用我生锈的C)它将转换它将创建一个新的uin16数组并在其中写入V8字符串的内容,然后它将确保转换没有写出范围之外的任何值0 - 255,这是到底是什么失败了.

我无法找到关于这是否是V8问题的任何内容.

由于代码是在此提交中添加的,因此我在此处建议的唯一方法是尝试在添加代码之前提交中提取树.由于之后的所有版本都有崩溃代码.

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

  • 血淋淋的地狱!一个硬编码的小端假设!该代码需要被取回并拍摄! (6认同)