使用 v8::Debug::SetMessageHandler 时读取访问冲突

Read access violation while using v8::Debug::SetMessageHandler

我正在尝试在我的 Qt 应用程序中实现 V8 调试器,但出现异常。

我有 2 个线程:主线程(处理 GUI 和调试器命令)和引擎线程(运行 javascript 代码)。

  1. 在主线程中,我通过调用初始化 V8:

    V8::InitializeICU();
    mPlatform = platform::CreateDefaultPlatform();
    V8::InitializePlatform(mPlatform);
    V8::Initialize();
    
  2. 我正在引擎线程中创建隔离:

    ArrayBufferAllocator* allocator = new ArrayBufferAllocator();
    Isolate::CreateParams create_params;
    create_params.array_buffer_allocator = allocator;
    isolate = Isolate::New(create_params);
    
  3. 在主线程中,我正在使用 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|
    }
    
  4. 与 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()