运行以下程序时,我遇到了 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++
这个致命错误不会出现在Release
node 的版本中。然而,它似乎巧妙地破坏了 V8 引擎,并最终在一段随机代码中失败了一点。
现在,我想出的唯一解决方法是泄漏光纤,这样这段代码就不会被命中。我是在做一些特别错误的事情还是这是一个错误fibers
?