【问题标题】:google v8 persistent Context - script compilation crashesgoogle v8 持久化上下文 - 脚本编译崩溃
【发布时间】:2020-03-21 07:18:12
【问题描述】:

我正在尝试为以后的执行使用一个全局上下文。调用 function1 时,脚本会返回正确的值。但是,当我在那之后调用 function2 时,Script::Compile 崩溃。函数 1 是 v8 的初始化,所以我只调用了一次。

全局变量:

    Isolate *isolate;
    Persistent<Context> pContext;

函数1的代码:

    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));

函数2:

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() 的函数

【问题讨论】:

    标签: c++ compilation v8 embedded-v8


    【解决方案1】:

    看起来这与Embedded V8 context and script compilation crash 的问题相同:v8::platform::NewDefaultPlatform 返回一个std::unique_ptr(由于使用了auto,您看不到它),所以当它超出范围时它会被销毁.让它成为一个全局变量,一切都应该起作用。

    注意 1:如果您编译了 Debug 版本并使用了 Debugger,您将能够自己解决此类问题,与必须在某处发布问题然后等待有人回答相比,这将为您节省大量时间忙着回答。

    注意 2:小心auto。类型是有意义的;看到它们(通过拼写出来)有助于避免错误,正如这个问题所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2012-05-08
      • 2013-05-15
      相关资源
      最近更新 更多