QuickJS—在尝试运行脚本时获得段错误



我是QuickJS的新手,我正在尝试制作一个加载和运行脚本的基本程序。

下面是加载并运行脚本的代码片段:

auto jsr = shared_ptr<JSRuntime>(JS_NewRuntime(), JS_FreeRuntime);
for (auto &f : files){
auto ctx = shared_ptr<JSContext>(JS_NewContext(jsr.get()), JS_FreeContext);
js_init_module_os(ctx.get(), "os");
js_init_module_std(ctx.get(), "std");
size_t bufLen = 0;
auto buf = js_load_file(ctx.get(), &bufLen, f.c_str());
cout << "Starting Evaluationn";
JS_Eval(ctx.get(), (char*)buf, bufLen, f.c_str(), JS_EVAL_TYPE_MODULE);
cout << "Ending Evaluationn";
}

下面是我正在运行的脚本:

import {sleep} from 'os';
for (let i = 0; i < 100; i++)
{
print("First Sleep: "+i);
sleep(1000);
}

当This执行时,我在"开始评估"之后得到一个段错误,所以我知道它发生在JS_Eval调用中。

我可以使用qjs实用程序运行这个脚本。看看qjs.c,与我的程序相比,qjs做了相当多的额外处理。然而,它是非常复杂的,我不知道我到底做错了什么与qjs相比。

以前有人遇到过这种问题吗?

感谢

我最近写了一个" minimal"用嵌入式quickjs编写C程序,并遇到了类似的问题。下面是我最终需要添加的代码行,以使事情正常工作:

  • js_std_init_handlers(runtime);:不确定?但是没有它就会出现分段故障
  • js_std_add_helpers(ctx, 0, 0);:添加print()

有了这些行,加上上面的行,我就可以执行脚本了。

这是我的c程序

// gcc mvp.c -o mvp -lm -Lquickjs -Iquickjs -lquickjs
#include "quickjs-libc.h"
#include "quickjs.h"
int main(const int argc, const char **argv) {
JSRuntime *runtime = JS_NewRuntime();
js_std_init_handlers(runtime);
// JS_SetModuleLoaderFunc(runtime, NULL, js_module_loader, NULL);
JSContext *ctx = JS_NewContext(runtime);
js_init_module_std(ctx, "std");
js_init_module_os(ctx, "os");
js_std_add_helpers(ctx, 0, 0);
size_t buf_len;
uint8_t *buf = js_load_file(ctx, &buf_len, argv[1]);
JSValue result = JS_Eval(ctx, buf, buf_len, argv[1], JS_EVAL_TYPE_MODULE);
// js_std_loop(ctx);
}

上面的两行我已经注释掉了,因为在您的示例脚本中没有必要:

  • JS_SetModuleLoaderFunc:如果我导入了任何非本地模块,则必需。
  • js_std_loop: "事件循环,">