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 (VC2013 をvcbuild x86 Debug使用してビルド)
  • GitHub リポジトリから取得した node-fibers 1.0.1 (npmjs ではない)

アサーションの失敗はgc()呼び出しの下で発生します。以下は、GC コールバックからfibersASSERT ステートメントまでのコール スタックです。

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ですか?

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 に答える