- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试使用 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/
我一直在尝试使用 Ubuntu 16.04.3 LTS 附带的 Mozilla/SeaMonkey JavaScript 库,mozjs185-1.0 , 但我遇到了 SIGSEGV当我尝试调用 JS
我是一名优秀的程序员,十分优秀!