使用 v8::Debug::SetMessageHandler 时读取访问冲突
Read access violation while using v8::Debug::SetMessageHandler
我正在尝试在我的 Qt 应用程序中实现 V8 调试器,但出现异常。
我有 2 个线程:主线程(处理 GUI 和调试器命令)和引擎线程(运行 javascript 代码)。
在主线程中,我通过调用初始化 V8:
V8::InitializeICU();
mPlatform = platform::CreateDefaultPlatform();
V8::InitializePlatform(mPlatform);
V8::Initialize();
我正在引擎线程中创建隔离:
ArrayBufferAllocator* allocator = new ArrayBufferAllocator();
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = allocator;
isolate = Isolate::New(create_params);
在主线程中,我正在使用 SetMessageHandler
isolate->Enter();
v8::Debug::SetMessageHandler(HandleMessage);
// HandlMessage function:
void HandleMessage(const v8::Debug::Message& message) {
v8::String::Utf8Value response(message.GetJSON());
// TODO do something with |response|
}
与 SetMessageHandler 一致时,我遇到读取访问冲突
这是调用堆栈:
FWIW 我也在 v8-users 讨论组中询问过。 (还没有答案)
提前致谢!
Ben Noordhuis 回答了我 here I should use v8::Locker to synchronize isolates between threads. Here is example。此外,在 v8::Debug::SetMessageHandler(HandleMessage);
之后缺少 isolate->Exit()
我正在尝试在我的 Qt 应用程序中实现 V8 调试器,但出现异常。
我有 2 个线程:主线程(处理 GUI 和调试器命令)和引擎线程(运行 javascript 代码)。
在主线程中,我通过调用初始化 V8:
V8::InitializeICU(); mPlatform = platform::CreateDefaultPlatform(); V8::InitializePlatform(mPlatform); V8::Initialize();
我正在引擎线程中创建隔离:
ArrayBufferAllocator* allocator = new ArrayBufferAllocator(); Isolate::CreateParams create_params; create_params.array_buffer_allocator = allocator; isolate = Isolate::New(create_params);
在主线程中,我正在使用 SetMessageHandler
isolate->Enter(); v8::Debug::SetMessageHandler(HandleMessage); // HandlMessage function: void HandleMessage(const v8::Debug::Message& message) { v8::String::Utf8Value response(message.GetJSON()); // TODO do something with |response| }
与 SetMessageHandler 一致时,我遇到读取访问冲突
这是调用堆栈:
FWIW 我也在 v8-users 讨论组中询问过。 (还没有答案)
提前致谢!
Ben Noordhuis 回答了我 here I should use v8::Locker to synchronize isolates between threads. Here is example。此外,在 v8::Debug::SetMessageHandler(HandleMessage);
isolate->Exit()