我想在项目中使用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 Answer,Set
中不再存在问题(它不再中止),但是,公开的名称仍然不可用,并且会导致ReferenceError ... < / p>
答案 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 ::调用新创建的线程并使用范围在新线程中输入它来实现它。
我在这里写了这篇文章,因为当我进行谷歌搜索分段错误时,这是唯一有用的东西。