gpt4 book ai didi

c++ - 两次调用 JS_NewStringCopyN 时出现 SIGSEGV

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:59 26 4
gpt4 key购买 nike

我一直在尝试使用 Ubuntu 16.04.3 LTS 附带的 Mozilla/SeaMonkey JavaScript 库,mozjs185-1.0 , 但我遇到了 SIGSEGV当我尝试调用 JS_NewStringCopyN 时两次分配两个JSString来自 char * 的对象字符串。

我的示例代码如下:

#include <js/jsapi.h>
#include <js/jscntxt.h>
#include <js/jscompartment.h>

size_t gStackChunkSize = 8192;

static void
my_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
{ }

int main(int argc, char *argv[]) {
JSRuntime *rt = JS_NewRuntime(256L * 1024L * 1024L);
if (!rt)
return -1;

JSCompartment compartment(rt);
JSContext *cx = JS_NewContext(rt, gStackChunkSize);
if (!cx)
return -2;
JS_SetErrorReporter(cx, my_ErrorReporter);
cx->compartment = &compartment;

const char data[] = "PScript5.dll Version 5.2.2";
const char data2[] = "Thom Parker";

JSString *str = JS_NewStringCopyN(cx, data, sizeof(data));
JSString *str2 = JS_NewStringCopyN(cx, data2, sizeof(data2));

return 0;
}

我用它编译:

g++ test.cpp -o mdntest -I/usr/include/nspr -lmozjs185-1.0 -L/usr/lib/x86_64-linux-gnu -lz -lnspr4  -lpthread

当我运行 ./mdntest它生成一个 SIGSEGV和崩溃。调试了 Mozilla JavaScript 库的 1.8.5 版本后,我知道在第二次调用 JS_NewStringCopyN 期间发生了什么。是垃圾收集器被调用 ( JS_gc ) 并且在某个地方它试图做一个标记和清除传递但正在访问一些无效的内存,在调用 js::gc::ArenaBitmap::markIfUnmarked 的后台跟踪中深入 30 级.

我的理论是,在调用第一个 JS_NewStringCopyN 后,我忘记了一些未记录的事情。 .如有任何建议或帮助,我们将不胜感激。

最佳答案

在上面的示例代码中,我发现的问题是 JSCompartment 必须在使用前手动初始化。

因此,通过添加:

compartment.init();

JSCompartment compartment(rt); 中构造隔间后,两个 JS_NewStringCopyN 被正确调用,垃圾收集器 JS_gc 运行没有错误。为什么 JSCompartment 不在其构造函数中调用 JSCompartment::init() 以及为什么没有明确记录这超出了我的范围。

关于c++ - 两次调用 JS_NewStringCopyN 时出现 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46087608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com