Node.js,Cygwin和Socket.io走进一个酒吧… Node.js抛出ENOBUFS和所有人死亡
我希望有人能帮助我,我自己也没有太多的运气。 我在Cygwin上运行node.js版本0.3.1。 我正在使用Connect和Socket.io。 我似乎有一些随机的问题,或者什么的,我还没有弄明白。 最终的结果是,我的服务器运行良好,但是当浏览器尝试连接到它的初始HTTP请求工作,Socket.io连接,然后服务器死亡(输出下面)。
我不认为这与HTTP请求有任何关系,因为服务器获取了大量的数据,并且正在接收请求并响应,直到我的连接将其杀死。 我search了一下,我发现最接近的东西是DNS设置不正确。 这是一个只在内部networking上运行的networking程序,所以我把/etc/resolv.conf
的nameserver xxxx
设置为内部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问题的地方。 我已经编辑源代码以包含&& errno != ENOBUFS
,它现在可以防止服务器死亡,但现在LDAP请求不起作用。 我不确定那会是什么问题。 正如我所提到的,这是一个内部唯一的应用程序,所以我把/etc/resolv.conf
中的DNS服务器设置到正在应用到主机的DNS服务器上。 不知道这是否是问题的一部分?
编辑2
这是gdb --args ./node_g --debug ../myscript.js
的一些输出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)
好吧,我周围挖了一下,第二次编辑后,我发现这个问题列表上的错误 。
我没有说明这是否是在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)它将转换它将创build一个新的uin16数组,并在其中写入V8string的内容,然后它将确保铸造没有写入范围之外的任何值0 - 255
,而这正是这里失败的原因。
我无法find有关这是否是V8问题的任何信息。
由于代码是在这个提交中添加的,我可以在这里提出的唯一的build议是在添加代码之前尝试从提交中提取树。 因为之后的所有版本都有崩溃的代码。
如果可行的话,我build议你在Node.js问题列表中提交另一个bug报告,尽pipe我今天晚些时候做了这个。
非常难以回答这个问题,但为主题行+1。
Node.js随主构build一起提供了一个testing套件,你有没有运行? 我已经成功地build立了节点,但是因为我省略了OpenSSL,所以我的Web套接字testing失败了。 安装/重build修复它。 testing项目帮助我诊断问题。
build议做“做testing” http://nodejs.org/#download描述。;