在“callback”函数中无法访问V8上下文

我正在写一个NodeJS插件,我使用了一个C库,可以让你在某些事件中注册一个callback函数。 当callback被触发时,我想调用一个NodeJScallback函数。 问题是,在我的Ccallback函数中,当尝试执行与V8相关的任何操作时(例如创buildHandleScope),我会遇到分段错误。

在test.js中:

... myaddon.register(function(data) { console.log("data: " + JSON.stringify(data)); }); ... 

在test.c中:

 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <node.h> #include <v8.h> using namespace v8; void WINAPI myEvent(int num, void * context) { HandleScope scope; // Segmentation fault here! Local<Function> * cb = (Local<Function>*)(context); Local<Object> obj = Object::New(); obj->Set(String::NewSymbol("id"), Number::New(num)); const int argc = 1; Local<Value> argv[argc] = { obj }; (*cb)->Call(Context::GetCurrent()->Global(), argc, argv); sleep(1); } Handle<Value> RegisterEvent(const Arguments& args) { HandleScope scope; Local<Function> cb = Local<Function>::Cast(args[0]); int callbackId = registerEvent((Event)&myEvent, &cb ); printf("callback id: %i\n", callbackId); init(); return scope.Close(Integer::New(callbackId)); } void init(Handle<Object> exports) { exports->Set(String::NewSymbol("register"), FunctionTemplate::New(RegisterEvent)->GetFunction()); } NODE_MODULE(test, init) 

编辑:用真正的代码更新。

编辑:我只是改变了这个问题的标题,因为问题可能是我的callback函数不能访问V8上下文。 由于我在创buildHandleScope实例时遇到了分段错误,所以我看不出还有什么可能。 除了这个问题之外,我试图在V8文档中find答案,但这个问题很大,我没有那么多的时间去testing和调查。

您的处理函数myEvent()必须在V8线程中调用。 如果不是,则必须将事件通知发布到V8线程中:

https://stackoverflow.com/a/15701160/1355844

https://stackoverflow.com/a/22946062/1355844

看起来你可能已经忘记为你的variables创build一个HandleScope了。 这应该适合你。

 void callbackFunc() { HandleScope scope; Local<Object> obj = Object::New(); }