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;