我在运行以下程序时遇到 V8 报告的 fatal error :
var Fiber = require("fibers");
Fiber(function () {});
global.gc();
用于运行它的命令:
> node --expose-gc scratch.js
fatal error 的文本如下:
#
# Fatal error in ..\..\src\global-handles.cc, line 99
# CHECK(state_ != FREE) failed
#
我正在使用以下版本:
- Node 0.10.25 x86(使用 VC2013 使用
vcbuild x86 Debug
构建) - node-fibers 1.0.1 取自 GitHub 存储库(不是 npmjs)
断言失败发生在 gc()
调用之下。这是从 GC 回调回调到 fibers
一直到 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++
此 fatal error 不会出现在 Release
版本的 Node 中。然而,它似乎巧妙地破坏了 V8 引擎,并最终在一段随机代码中失败了一点。
现在,我想出的唯一解决方法是泄漏光纤,这样这段代码就永远不会被命中。我是不是做错了什么,或者这是 fibers
中的错误?
最佳答案
此错误现在显然已通过此提交修复:
https://github.com/laverdet/node-fibers/commit/3e154941ba5c3234752af304defcf028107e5557
源码/fibers.cc
@@ -231,7 +231,6 @@类纤维{
返回;
}
- that.handle.Dispose();
删除 &that;
}
关于node.js - 在 node.js 中使用 Node 纤程时,在 GC 期间 V8 内部出现 "Fatal error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21407365/