javascript - Node.js、Cygwin 和 Socket.io 走进一家酒吧……Node.js 抛出 ENOBUFS,所有人都死了

标签 javascript dns cygwin node.js

我希望这里有人可以帮助我,我自己解决这个问题的运气并不好。我在 Cygwin 上运行 node.js 版本 0.3.1。我正在使用 Connect 和 Socket.io。我似乎在 DNS 或其他方面遇到了一些随机问题,我还没有完全弄清楚。最终结果是我的服务器运行良好,但是当浏览器尝试连接到它时,初始 HTTP 请求工作,Socket.io 连接,然后服务器死掉(下面的输出)。

我认为这与 HTTP 请求没有任何关系,因为服务器收到了很多发布给它的数据,并且它一直在接收请求并做出响应,直到我的连接杀死它。我用谷歌搜索了一下,我发现最接近的是 DNS 设置不正确。这是一个只能在内部网络上运行的网络程序,所以我将 /etc/resolv.conf 中的 nameserver x.x.x.x 设置为内部 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)

编辑

在客户端连接以获取信息后,我立即使用 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)

最佳答案

好的,我挖掘了一下,在您的第二次编辑后,我找到了 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 问题列表上提交另一个错误报告,尽管我今天晚些时候这样做了。

关于javascript - Node.js、Cygwin 和 Socket.io 走进一家酒吧……Node.js 抛出 ENOBUFS,所有人都死了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658104/

相关文章:

docker - 如何在Kubernetes部署类型中覆盖dnsconfig

c - gdb - cygexpat-1.dll 缺失

linux - 比较多个文本文件中的行数

c++ - makefile,缺少分隔符错误

javascript - 从 bootstrap 弹出窗口打开隐藏的 div

javascript - soundcloud API - 检测轨道是否不存在/SC.Widget.Events.ERROR

javascript - 如何在 for 循环中每次强制异步完成,并修改全局变量?

javascript - 通过减去选项计算总数 - 动态形式 - Yii2

azure - 我想将自定义域引入我的 Azure 网站

php - 多个域可改变共享主机 PHP 文件上的内容