2017-10-09 75 views
0

我正在將一些第三方產品集成到Chromium中Android)在瀏覽器進程(main)中工作。 該產品採用了鉻的V8和使用IsolateHolder正在創造新的IsolateV8 assertion調試檢查失敗:ThreadId :: Current()。Equals(compilation_info() - > isolate() - > thread_id())`失敗

// 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新線程的代碼從被轉發到C主線程(從Android的活動援引++通過生成的JNI)。

... E/V8:# #致命在../../v8/src/compiler.cc誤差,線87

然後有時它用下面的崩潰

調試檢查失敗:ThreadId :: Current()。Equals(compilation_info() - > isolate() - > 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 

任何建議高度讚賞!

PS。我使用的不是Chromium的最新版本,但我不認爲這是問題的原因。

PPS。我試圖使用一些現有的後臺線程(與content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::FILE)),甚至在後臺線程中創建Isolate,並將其作爲IsolateHolder參數傳遞 - 沒有運氣。

+0

請注意,爲什麼會將此標記爲[嵌入] - 可能不相關。 – Clifford

回答

0

isolate_holder->isolate()->Enter();不是必需的,甚至是傷害的(因爲它是由使用Isolate實例的庫完成的),但會影響很久以後。

1

如果我理解正確,你試圖讓V8實例在後臺線程上運行,同時從主線程調用它(代碼片段的末尾返回一個Isolate*指針 - 主線程,我相信?)。這不被支持。

你當然可以讓V8在後臺線程上運行,但是你需要確保所有的V8 API調用都發生在同一個後臺線程上。您必須自己實現跨線程通信邏輯(可能使用Chromium的現有PostTask etc原語)。

+0

我會同意V8在任何主線或背景線程中運行。我試圖使用主線程創建隔離實例和調用,但因爲斷言失敗。我也會仔細檢查來自主線程的調用。隔離和調用是否需要在同一個線程中完成是否正確? – 4ntoine

+0

BTW沒有使用'gin :: IsolateHolder :: AccessMode :: kUseLocker);'對於多線程(從不同線程調用V8方法)是否可行? – 4ntoine

+1

對不起,我對'gin :: IsolateHolder'不夠熟悉,不能確定地回答。一般來說,如果您需要與來自不同線程的'V8 :: Isolate'進行交互,您必須使用顯式鎖定來確保一次只有一個線程處於活動狀態 - 而不僅僅是一個'isolate() - >輸入()'前面!通常,只從一個線程與'Isolate'進行交互是比較容易的。 – jmrk