首页 > 解决方案 > V8 QuickIsUndefined 在使用 IsConstructCall 时随机崩溃

问题描述

我有一个功能:

auto func = v8::FunctionTemplate::New(context,
    [](const v8::FunctionCallbackInfo<v8::Value>& args) {
        auto isolate = args.GetIsolate();
        if (args.IsConstructCall()) { ... }
        ...
    }).ToLocalChecked();

我将这个功能暴露如下。

global->Set(isolate, "func", func);

我将该函数用作普通函数和构造函数,

func();
new func();

调用时 V8 被压碎IsConstructCall。我发现IsConstructCall用于QuickIsUndefined检查是否NewTarget存在undefined。问题发生在内部ReadRawField,由GetInstanceTypeQuickIsUndefined调用GetInstanceType

v8-internal.h 中的错误,第 305 行

由于T=unsigned short,我添加reinterpret_cast<unsigned short*>(addr)到手表上,结果是这样的,和异常所说的不同。

在此处输入图像描述

更让我困惑的是,有时我的程序运行良好而不会崩溃。而不是IsContructCall,我使用v8::Undefinedand Value::Equals,它运行良好。

!args.NewTarget()->Equals(isolate->GetCurrentContext(), v8::Undefined(isolate)).ToChecked()

似乎QuickIsUndefined有一些问题,但我无法确定问题所在。在这种情况下有什么帮助?我在单体模式下使用 MSVC 编译了 V8。

标签: c++v8embedded-v8

解决方案


我遇到了同样的问题:尝试使用 -DV8_COMPRESS_POINTERS 编译您的代码。V8 现在默认压缩指针。

v8-internal.h "ReadRawField" 可以帮助你了解背景


推荐阅读