调用本机插件时nodejs v8垃圾回收

时间:2017-06-13 06:36:23

标签: node.js garbage-collection electron node.js-addon

我在mac上开发了一个带有原生插件的电子应用程序,所有组件的工作流程如下: js in electron - >调用addon.node(c ++ native addon) - >使用dlopen和dlsym调用dylib。

通过这种方式来自js的addon get字符串:

NAN_METHOD(CallAsyncFunction) {

    // actions guarantee dll is loaded
    //....

    const char* funcName = *Utf8String(info[0]->ToString());
    const char* funcParam = *Utf8String(info[1]->ToString());

    //get function pointer by dlsym
    //call the function in dylib

}

昨天我们发现了一个非常有趣的错误。它发生在字符串参数非常长时,对于大小约为400字节甚至更长的funcParam字符串,登录dylib显示funcParam到达的长度为0,而以相同方式发送的funcName具有正确的长度并且内容。经过一些调试后我猜到字符串可能是垃圾收集的,所以我创建了一个字符串对象来保存funcParam,然后再将新指针发送到dylib,它有效!

我的问题是:js引擎是如何工作的,以便字符串资源指针可以在js native addon中访问,而dylib在本机插件调用时不可用?

1 个答案:

答案 0 :(得分:0)

我认为实际的问题是你在同一行创建并销毁Utf8Value,并试图取消引用悬空指针。它应该是

Utf8String str(info[0]->ToString());
const char* funcName = *str;