将异常转换为字符串时在v8中崩溃

时间:2013-06-04 22:10:42

标签: v8

我正在尝试进行一些错误检查,以检测从C ++调用的javascript回调函数是否会产生任何错误。这段代码在v8 :: String :: Utf8Value构造函数上崩溃,我无法弄清楚原因。

v8::Locker locker;
v8::HandleScope scope;
v8::TryCatch tryCatch;

v8::Persistent<v8::Function> func = static_cast<PieMenu*> (info.Packet->Control)->m_callback_functions[info.Packet->Integer];
v8::Handle<v8::Value> v =   func->Call ((func), 0, NULL);

if (tryCatch.HasCaught()) {  
    v8::String::Utf8Value exception_str(tryCatch.Exception());
    if (exception_str.length() > 0) {
        wxLogVerbose(std::string(*exception_str).c_str());
    }
}

错误是“访问冲突读取位置0x0000000000000027”。这导致我怀疑异常对象中有一个错误的指针,但我不确定在哪里看。这是堆栈跟踪:

v8.dll!v8::internal::Execution::ToString(v8::internal::Handle<v8::internal::Object> obj={...}, bool * exc=0x00000000027be8a0) 
v8.dll!v8::Value::ToString()
v8.dll!v8::String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj={...})

我正在使用Visual Studio 2008和最新的trunk v8代码。

1 个答案:

答案 0 :(得分:0)

从内存地址看,它看起来就像试图从指向NULL的对象中读取属性一样。

我认为你的Call电话是错误的。我记得在传递NULL作为第三个参数时遇到了类似的问题,即使你传递了0个参数。试试这个:

v8::Handle<v8::Value> argv;
func->Call ((func), 0, &argv);