nodejs v8 сборка мусора при вызове нативного аддона

Я разрабатываю электронное приложение с нативным аддоном для Mac, и рабочий процесс всех компонентов выглядит следующим образом: js in Electron -> Call addon.node(C++ native addon) -> Вызов dylib с использованием dlopen и dlsym.

аддон получает строку из 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

}

Вчера мы нашли ошибку, которая очень интересна. Это произошло, когда строковый параметр очень длинный, для строки funcParam размером около 400 байт или даже больше, журнал в dylib показывает, что длина поступившего funcParam равна 0, тогда как funcName, отправленное таким же образом, имеет правильную длину и содержание. После некоторой отладки я догадался, что строка могла быть собрана сборщиком мусора, поэтому я создал строковый объект для сохранения funcParam, а затем снова отправил новый указатель на dylib, это сработало!

Мой вопрос: как работает движок js, чтобы указатель строкового ресурса был доступен в аддоне js native, а в dylib - вызове нативного addon?

1 ответ

Я думаю, что настоящая проблема в том, что вы создаете и уничтожаете Utf8Value в той же строке и пытаются разыменовать висячий указатель. Это должно быть вместо

Utf8String str(info[0]->ToString());
const char* funcName = *str;
Другие вопросы по тегам