我正在尝试使用一个全局上下文进行以后的执行。调用function1时,脚本返回正确的值。但是,当我在那之后调用function2时,Script :: Compile崩溃。函数1是v8的初始化,因此我只调用它一次。
全局变量:
Isolate *isolate;
Persistent<Context> pContext;
function1的代码:
auto platform = platform::NewDefaultPlatform();
V8::InitializePlatform(platform.get());
V8::Initialize();
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
isolate = Isolate::New(create_params);
Locker locker(isolate);
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Context::New(isolate);
pContext.Reset(isolate, context);
Context::Scope context_scope(context);
Local<Script> script = Script::Compile(context, to_v8(isolate, "'Test'")).ToLocalChecked();
Local<Value> r = script->Run(context).ToLocalChecked();
cout << "script result: " << *(String::Utf8Value(isolate, r));
function2:
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Local<Context>::New(isolate, pContext);
Local<Script> script = Script::Compile(context, to_v8(isolate, "'Test'")).ToLocalChecked();
Context::Scope context_scope(context);
Local<Value> r = script->Run(context).ToLocalChecked();
cout << "script result: " << *(String::Utf8Value(isolate, r));
我得到的Stacktrace:
at v8::internal::Compiler::GetSharedFunctionInfoForScript[v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, v8::Extension*, v8::internal::ScriptData*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, v8::internal::NativesFlag] (UnknownFile:?)
at v8::ScriptCompiler::CompileUnboundInternal[v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason] (UnknownFile:?)
at v8::ScriptCompiler::Compile[v8::Local<v8::Context>, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason] (UnknownFile:?)
at v8::Script::Compile[v8::Local<v8::Context>, v8::Local<v8::String>, v8::ScriptOrigin*] (UnknownFile:?)
to_v8是v8 :: String :: NewFromUtf8()的函数
看起来像是与Embedded V8 context and script compilation crash相同的问题:v8::platform::NewDefaultPlatform
返回std::unique_ptr
(由于使用了auto
而没有看到),因此当它超出范围时会被销毁。将其设置为全局变量,然后一切正常。
注1:如果您编译了Debug版本并使用了Debugger,则可以自己解决此类问题,与不得不在某个地方发布问题然后等待某人获得答案相比,这可以节省很多时间。来回答它。
注2:注意auto
。类型是有意义的。如这个问题所示,看到它们(通过将它们拼写出来)有助于避免错误。