【问题标题】:nodejs v8 garbage collection when calling native addon调用本机插件时的nodejs v8垃圾收集
【发布时间】:2017-06-13 06:36:23
【问题描述】:

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

插件通过这种方式从js获取字符串:

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

}

昨天我们发现了一个非常有趣的错误。字符串param很长的时候会出现这种情况,对于一个大小约400字节甚至更长的funcParam字符串,dylib中的log显示到达的funcParam长度为0,而同样发送的funcName长度正确,内容。经过一些调试后,我猜测该字符串可能已被垃圾收集,所以我创建了一个字符串对象来保存 funcParam,然后再次将新指针发送到 dylib,它起作用了!

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 2011-08-01
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多