【问题标题】:Node.js, Cygwin and Socket.io walk into a bar... Node.js throws ENOBUFS and everyone diesNode.js、Cygwin 和 Socket.io 走进一家酒吧……Node.js 抛出 ENOBUFS,所有人都死了
【发布时间】:2011-01-11 13:26:45
【问题描述】:

我希望这里有人可以帮助我,我自己解决这个问题的运气并不好。我在 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.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)

【问题讨论】:

  • 如果您不发布代码本身,那么可能有点难以猜测问题所在。
  • 代码不是问题。我正在用更多信息更新问题。
  • 如果没有符号名称,堆栈跟踪并不太有用。也许在 gdb 下运行 node 并获得有意义的堆栈跟踪?
  • 你试过用 node v0.2.6 运行它吗?
  • 我没有这个问题的答案。但是,我很肯定 Chuck Norris 已经用暴力解决了这个问题——你试过了吗? +1 标题:D

标签: javascript dns cygwin node.js


【解决方案1】:

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

【讨论】:

  • 那次提交是一年半前的事了,我不知道模块/我的代码是否可以在那个环境中工作?是否可以只在较新版本中更改代码。
  • 我想这是可能的,但它需要相当多的测试,而且我对 C++ V8 和 C++ 的了解非常有限,最好将其发布在 Node.js 谷歌群组上,或者也许甚至进入 freenode 上的#node.js,因为 GitHub 上的问题跟踪器大部分时间都被忽略了。
  • 该死的!一个硬编码的小端假设!该代码需要取出并拍摄!
  • @Ivo Wetzel:我也发到了google群,在IRC频道试了试运气,但目前还没有运气...
  • 我认为这绝对是一个问题,但我不认为这是我的问题。每当我将 && errno != ENOBUFS 添加到 node_net.cc 时,程序就会停止崩溃,它只是阻止了传出连接。当 gdb 运行时,它似乎在 socket.io 连接时崩溃,这是一个不同的问题。
【解决方案2】:

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

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

建议按照http://nodejs.org/#download 的描述进行“进行测试”。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-08-13
    • 2013-07-24
    • 1970-01-01
    • 2017-06-12
    • 2011-09-08
    相关资源
    最近更新 更多