在类中包装V8时出现分段错误?

时间:2010-11-23 03:40:44

标签: c++ v8 embedded-v8

我想在项目中使用Google的Javascript引擎V8,并尝试为引擎编写包装类。部分代码是从样本/ shell.cc,V8发行版中复制的。

然而,它只是因为Segmentation故障而中止,我无法弄清楚原因,尽管问题发生在v8::internal::Top::global_context()左右(由于context无效,似乎是NULL) ..代码本身对我来说很好,但也许我做了一些非常愚蠢的事情: - )。

我的代码中的分段错误发生在v8::Script::Compile

问题代码(已更新):https://gist.github.com/4c28227185a14bb6288c

感谢Luis G. Costantini R.'s AnswerSet中不再存在问题(它不再中止),但是,公开的名称仍然不可用,并且会导致ReferenceError ... < / p>

5 个答案:

答案 0 :(得分:1)

你要改变v8 :: Context :: Scope context_scope(context);从构造函数(第134行)到internal_executeString(在script = v8 :: Script :: Compile(source,name);之前)。那是因为类v8 :: Context :: Scope的析构函数退出了上下文。

我改变了方法addFunction:

void addFunction(const std::string& fname, v8::InvocationCallback func)
{
    v8::HandleScope handle_scope;
    std::cout << "before ::Set()" << std::endl;
    v8::Context::Scope context_scope(context);
    context->Global()->Set(v8::String::New(fname.c_str()),
                           v8::FunctionTemplate::New(func)->GetFunction());
    std::cout << "after ::Set()" << std::endl;
}

必须将该函数添加到用于执行脚本的上下文的全局对象中。 V8有一个很好的教程(分两部分): http://www.homepluspower.info/2010/06/v8-javascript-engine-tutorial-part-1.html  和 http://www.homepluspower.info/2010/06/v8-javascript-engine-tutorial-part-2.html

答案 1 :(得分:1)

如果在输入上下文(通过Context :: Scope)之前尝试创建JavaScript函数(FunctionTemplate :: GetFunction())或JavaScript Object(ObjectTemplate :: NewInstance())的实例,则会出现分段错误。原因是:没有可用的JavaScript上下文,并且Function和Object始终只存在于JavaScript执行上下文中。根据V8文档:

<强>功能: JavaScript函数对象(ECMA-262,15.3)。

<强>对象: JavaScript对象(ECMA-262,4.3.3)。

答案 2 :(得分:0)

堆栈回溯几乎无用,除非我下载所有源代码并尝试自己构建它,所以......:)

js.executeString("1+1", true, false);更改为js.executeString("1+1", true, true);并查看异常处理程序告诉您的内容?

答案 3 :(得分:0)

看起来你刚被this bug蜇了,就是说你还没注意到它。也许提交另一份报告,因为参考报告看起来很旧。也许深入挖掘并在每次函数调用时研究堆栈帧,直到收到Segmentation Fault,你可以找到解决方法或修复这个bug:)

答案 4 :(得分:0)

我有类似的分段错误,问题结果如下。我正在创建一个新线程并尝试在该线程中创建一个对象模板和对象。不幸的是,如果您创建一个线程,您需要确保再次输入v8 :: Context以执行此类操作。

我通过将Handle传递给v8 :: Context ::调用新创建的线程并使用范围在新线程中输入它来实现它。

我在这里写了这篇文章,因为当我进行谷歌搜索分段错误时,这是​​唯一有用的东西。