次のプログラムを実行すると、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 (VC2013 を
vcbuild x86 Debug
使用してビルド) - GitHub リポジトリから取得した node-fibers 1.0.1 (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++
Release
この致命的なエラーは、nodeのバージョンでは発生しません。ただし、V8 エンジンが微妙に破損しているように見え、最終的にはコードのランダムな部分で少し失敗します。
現在、私が思いついた唯一の回避策は、ファイバーをリークして、このコードがヒットしないようにすることです。私は何か特に間違ったことをしていますか、それとも のバグfibers
ですか?