V8 断言“调试检查失败:ThreadId::Current().Equals(compilation_info()->isolate()->thread_id())”失败
V8 assertion `Debug check failed: ThreadId::Current().Equals(compilation_info()->isolate()->thread_id())` failed
我正在致力于将某些第三方产品集成到 Chromium (Android) 中,该产品在浏览器进程(主要)中运行。
该产品使用 Chromium 的 V8 并正在使用 IsolateHolder
:
创建新的 Isolate
// 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,因为代码是从主线程调用的(来自 Android 的 activity,它通过生成的转发到 C++ JNI).
然后有时会崩溃并显示以下内容:
... E/v8: #
# Fatal error in ../../v8/src/compiler.cc, line 87
Debug check failed: 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
参数传递 - 运气不好。
如果我理解正确的话,您正试图在后台线程上拥有一个 V8 实例 运行,同时从主线程调用它(代码片段的末尾 returns Isolate*
指针——指向主线程,我猜?)。不支持。
你当然可以让 V8 在后台线程上运行,但是你需要确保所有 V8 API 调用都发生在同一个后台线程上。您必须自己实现跨线程通信逻辑(可能使用 Chromium 现有的 PostTask
等原语)。
isolate_holder->isolate()->Enter();
不是必需的,甚至会造成伤害(因为它是由使用该 Isolate
实例的库完成的)但会影响很晚。
我正在致力于将某些第三方产品集成到 Chromium (Android) 中,该产品在浏览器进程(主要)中运行。
该产品使用 Chromium 的 V8 并正在使用 IsolateHolder
:
Isolate
// 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,因为代码是从主线程调用的(来自 Android 的 activity,它通过生成的转发到 C++ JNI).
然后有时会崩溃并显示以下内容:
... E/v8: # # Fatal error in ../../v8/src/compiler.cc, line 87
Debug check failed: 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
参数传递 - 运气不好。
如果我理解正确的话,您正试图在后台线程上拥有一个 V8 实例 运行,同时从主线程调用它(代码片段的末尾 returns Isolate*
指针——指向主线程,我猜?)。不支持。
你当然可以让 V8 在后台线程上运行,但是你需要确保所有 V8 API 调用都发生在同一个后台线程上。您必须自己实现跨线程通信逻辑(可能使用 Chromium 现有的 PostTask
等原语)。
isolate_holder->isolate()->Enter();
不是必需的,甚至会造成伤害(因为它是由使用该 Isolate
实例的库完成的)但会影响很晚。