代码之家  ›  专栏  ›  技术社区  ›  4ntoine

V8断言“调试检查失败:ThreadId::Current()。等于(compilation\u info()->isolate()->thread\u id())`失败

  •  0
  • 4ntoine  · 技术社区  · 8 年前

    该产品使用Chromium的V8,并正在创造新的 Isolate IsolateHolder :

    // thread
    thread = new base::Thread("MyProductThread");
    thread->Start();
    
    #ifdef V8_USE_EXTERNAL_STARTUP_DATA
    LOG(WARNING) << "MyProduct: loading v8 snapshot & natives ...";
    gin::V8Initializer::LoadV8Snapshot();
    gin::V8Initializer::LoadV8Natives();
    LOG(WARNING) << "MyProduct: loaded v8 snapshot & natives";
    #endif
    
    LOG(WARNING) << "MyProduct: initialize isolate holder";
    gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode,
                                   gin::IsolateHolder::kStableV8Extras,
                                   gin::ArrayBufferAllocator::SharedInstance());
    
    isolate_holder = new gin::IsolateHolder(
      thread->task_runner(),
      gin::IsolateHolder::AccessMode::kUseLocker);
    isolate_holder->isolate()->Enter();
    
    LOG(WARNING) << "MyProduct: created isolate holder";
    
    // return isolate pointer
    v8::Isolate* isolate = isolate_holder->isolate();
    

    我创建新线程是为了不阻塞UI,因为代码是从主线程调用的(通过生成的JNI从Android的活动转发到C++)。

    然后,有时会出现以下情况:

    ... E/v8:# #../中出现致命错误/v8/src/编译器。cc,第87行

    调试检查失败:ThreadId::Current()。等于(compilation\u info()->隔离()->thread_id())

    这是什么意思?

    位受限堆栈跟踪:

    Stack Trace:
    
    
    RELADDR   FUNCTION                                                                                                                                                                                                                                                                                                                                                                                                                               FILE:LINE
      000161d5  gin::(anonymous namespace)::PrintStackTrace()                                                                                                                                                                                                                                                                                                                                                                                          /home/antoine/chromium/src/gin/v8_platform.cc:55
      0000d051  V8_Fatal(char const*, int, char const*, ...)                                                                                                                                                                                                                                                                                                                                                                                           /home/antoine/chromium/src/v8/src/base/logging.cc:123
      0022eca5  v8::internal::CompilationJob::PrepareJob()                                                                                                                                                                                                                                                                                                                                                                                             /home/antoine/chromium/src/v8/src/compiler.cc:86
      00235733  v8::internal::(anonymous namespace)::PrepareAndExecuteUnoptimizedCompileJob(v8::internal::ParseInfo*, v8::internal::FunctionLiteral*, v8::internal::Isolate*)                                                                                                                                                                                                                                                                          /home/antoine/chromium/src/v8/src/compiler.cc:387
      0022fe25  v8::internal::(anonymous namespace)::GenerateUnoptimizedCode(v8::internal::ParseInfo*, v8::internal::Isolate*, std::__ndk1::forward_list<std::__ndk1::unique_ptr<v8::internal::CompilationJob, std::__ndk1::default_delete<v8::internal::CompilationJob> >, std::__ndk1::allocator<std::__ndk1::unique_ptr<v8::internal::CompilationJob, std::__ndk1::default_delete<v8::internal::CompilationJob> > > >*)                             /home/antoine/chromium/src/v8/src/compiler.cc:413
      00231f13  v8::internal::(anonymous namespace)::CompileToplevel(v8::internal::ParseInfo*, v8::internal::Isolate*)                                                                                                                                                                                                                                                                                                                                 /home/antoine/chromium/src/v8/src/compiler.cc:786
      0023358d  v8::internal::Compiler::GetSharedFunctionInfoForScript(v8::internal::Handle<v8::internal::String>, v8::internal::Handle<v8::internal::Object>, int, int, v8::ScriptOriginOptions, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Context>, v8::Extension*, v8::internal::ScriptData**, v8::ScriptCompiler::CompileOptions, v8::internal::NativesFlag, v8::internal::Handle<v8::internal::FixedArray>)  /home/antoine/chromium/src/v8/src/compiler.cc:1331
      000ff8f1  v8::ScriptCompiler::CompileUnboundInternal(v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions)                                                                                                                                                                                                                                                                                                              /home/antoine/chromium/src/v8/src/api.cc:2314
      00100299  v8::ScriptCompiler::Compile(v8::Local<v8::Context>, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions)                                                                                                                                                                                                                                                                                                                   /home/antoine/chromium/src/v8/src/api.cc:2373
      00102047  v8::Script::Compile(v8::Local<v8::Context>, v8::Local<v8::String>, v8::ScriptOrigin*)                                                                                                                                                                                                                                                                                                                                                  /data/app/org.chromium.chrome-1/lib/arm/libv8.cr.so
    

    非常感谢您的任何建议!

    注:我使用的不是最新版本的铬,但我不认为这是问题的原因。

    PPS。我尝试使用一些现有的后台线程(带有 content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::FILE) 在后台线程中,并将其作为 隔离支架 争论-没有运气。

    2 回复  |  直到 8 年前
        1
  •  1
  •   jmrk    8 年前

    如果我理解正确的话,您正试图让V8实例在后台线程上运行,同时从主线程调用它(代码段的末尾返回一个 Isolate* 指针——我想是指向主线程?)。这是不支持的。

    您当然可以让V8在后台线程上运行,但是您需要确保所有V8 API调用都在同一个后台线程上进行。您必须自己实现跨线程通信逻辑(可能使用Chromium现有的 PostTask

        2
  •  0
  •   4ntoine    8 年前

    isolate_holder->isolate()->Enter(); 不是必需的,甚至是有害的(正如使用它的图书馆所做的那样) Isolate 但影响要晚得多。