3

运行以下程序时,我遇到了 V8 报告的致命错误:

var Fiber = require("fibers");
Fiber(function () {});
global.gc();

用于运行它的命令:

> node --expose-gc scratch.js

致命错误的文本如下:

#
# Fatal error in ..\..\src\global-handles.cc, line 99
# CHECK(state_ != FREE) failed
#

我正在使用以下版本:

  • 节点 0.10.25 x86(vcbuild x86 Debug使用 VC2013 构建)
  • node-fibers 1.0.1 取自 GitHub 存储库(不是 npmjs)

断言失败发生在gc()调用下方。fibers这是从 GC 回调回调到 ASSERT 语句的调用堆栈:

node.exe!v8::internal::GlobalHandles::Node::Release(v8::internal::GlobalHandles * global_handles) Line 99   C++
node.exe!v8::internal::GlobalHandles::Destroy(v8::internal::Object * * location) Line 431   C++
node.exe!v8::V8::DisposeGlobal(v8::internal::Object * * obj) Line 680   C++
node.exe!v8::Persistent<v8::Object>::Dispose() Line 4241    C++
fibers.node!Fiber::`scalar deleting destructor'(unsigned int)   C++
fibers.node!Fiber::WeakCallback(void * data) Line 235   C++
fibers.node!uni::WeakCallbackShim<&Fiber::WeakCallback>(v8::Persistent<v8::Value> value, void * data) Line 111  C++
node.exe!v8::internal::GlobalHandles::Node::PostGarbageCollectionProcessing(v8::internal::Isolate * isolate, v8::internal::GlobalHandles * global_handles) Line 233 C++

这个致命错误不会出现在Releasenode 的版本中。然而,它似乎巧妙地破坏了 V8 引擎,并最终在一段随机代码中失败了一点。

现在,我想出的唯一解决方法是泄漏光纤,这样这段代码就不会被命中。我是在做一些特别错误的事情还是这是一个错误fibers

4

1 回答 1

2

该错误现在显然已通过此提交修复:

https://github.com/laverdet/node-fibers/commit/3e154941ba5c3234752af304defcf028107e5557

src/fibers.cc @@ -231,7 +231,6 @@ class Fiber { return; } - that.handle.Dispose(); delete &that; }

于 2014-10-29T07:48:49.603 回答