On Fri, Apr 10, 2020 at 12:47 PM Chris Chen <chenqy930...@gmail.com> wrote: > > Hi, all, I am embedding v8 into a c++ program, and when trying to initialize > an Isolate again, the program crashes. > > The way I was doing is made an v8::Isolate as a member field of an JsEngine > instance, then call ~JsEngine() and renew a JsEngine instance. In > ~JsEngine(), I do stuff like disposed Isolate, shutdown platform, etc. > > This can be reproduced by some modification to samples/hello-world.cc as > following: > >>> int main(int argc, char* argv[]) { >>> >>> // Initialize V8. >>> >>> v8::V8::InitializeICUDefaultLocation(argv[0]); >>> >>> v8::V8::InitializeExternalStartupData(argv[0]); >>> >>> std::unique_ptr<v8::Platform> platform = >>> v8::platform::NewDefaultPlatform(); >>> >>> v8::V8::InitializePlatform(platform.get()); >>> >>> v8::V8::Initialize(); >>> >>> >>> // Create a new Isolate and make it the current one. >>> >>> v8::Isolate::CreateParams create_params; >>> >>> create_params.array_buffer_allocator = >>> >>> v8::ArrayBuffer::Allocator::NewDefaultAllocator(); >>> >>> v8::Isolate* isolate = v8::Isolate::New(create_params); >>> >>> { >>> >>> v8::Isolate::Scope isolate_scope(isolate); > > > // ------------------------------------------------- >>> >>> // ignore. evaluate some js strings here. > > // -------------------------------------------------- >>> >>> // Dispose the isolate and tear down V8. >>> >>> isolate->Dispose(); >>> >>> v8::V8::Dispose(); >>> >>> v8::V8::ShutdownPlatform(); >>> >>> delete create_params.array_buffer_allocator; >>> >>> > // -------------------------------------------------- >>> >>> // do it again for testing > > // -------------------------------------------------- >>> >>> v8::V8::InitializeICUDefaultLocation(argv[0]); >>> >>> v8::V8::InitializeExternalStartupData(argv[0]); >>> >>> std::unique_ptr<v8::Platform> platform2 = >>> v8::platform::NewDefaultPlatform(); >>> >>> v8::V8::InitializePlatform(platform2.get()); >>> >>> v8::V8::Initialize(); >>> >>> >>> // Create a new Isolate and make it the current one. >>> >>> v8::Isolate::CreateParams create_params2; >>> >>> create_params2.array_buffer_allocator = >>> >>> v8::ArrayBuffer::Allocator::NewDefaultAllocator(); >>> >>> v8::Isolate* isolate2 = v8::Isolate::New(create_params2); // crash here. > > >>> >>> return 0; >>> >>> } > > The output is like this: >>> >>> Hello, World! >>> >>> 3 + 4 = 7 >>> >>> Segmentation fault (core dumped) >> >> > > The backtrace looks like this: >> >> >> >> #0 __GI___pthread_mutex_lock (mutex=0x128) at >> ../nptl/pthread_mutex_lock.c:67 >> >> #1 0x00000000007f2073 in >> v8::internal::wasm::WasmEngine::AddIsolate(v8::internal::Isolate*) () >> >> #2 0x00000000004cadd8 in >> v8::internal::Isolate::Init(v8::internal::ReadOnlyDeserializer*, >> v8::internal::StartupDeserializer*) () >> >> #3 0x00000000004cb2b9 in >> v8::internal::Isolate::InitWithSnapshot(v8::internal::ReadOnlyDeserializer*, >> v8::internal::StartupDeserializer*) () >> >> #4 0x00000000007d4735 in >> v8::internal::Snapshot::Initialize(v8::internal::Isolate*) () >> >> #5 0x000000000044abf2 in v8::Isolate::Initialize(v8::Isolate*, >> v8::Isolate::CreateParams const&) () >> >> #6 0x000000000044ad42 in v8::Isolate::New(v8::Isolate::CreateParams const&) >> () >> >> #7 0x0000000000414a4e in main () >> >> (gdb) q > > > > Why this behavior will crash, and how to avoid this? > > Any hints would be great, Thanks in advance!
Call V8::InitializePlatform(), V8::Initialize(), V8::Dispose() and V8::ShutdownPlatform() only once, not twice. -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/CAHQurc-vt_uXrSH4La%3DcXe-O9qdtGyH7-T%2BSR-u0ymq-s95jOQ%40mail.gmail.com.