2017-06-13 2 views
0

Ich entwickle eine Elektronen App mit nativem Addon auf Mac, und der Workflow aller Komponenten ist wie folgt: js in electron -> call addon.node (C++ natives Addon) -> Rufen Sie dylib mit dlopen und dlsym auf.nodejs v8 garbage collection beim Aufruf des nativen Addons

das Addon get-String aus js auf diese Weise:

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 

} 

Gestern fanden wir einen Fehler, der sehr interessant ist. Es ist passiert, wenn der String-Parameter sehr lang ist, für eine FuncParam-String mit der Größe von etwa 400 Bytes oder noch länger, die Anmeldung in Dylib zeigt, dass die Länge von funcParam angekommen 0 ist, während der FuncName auf die gleiche Weise hat die richtige Länge und Inhalt. Nach einigem Debugging habe ich vermutet, dass der String von Garbage-Collected stammen könnte, also habe ich ein String-Objekt erstellt, um das funcParam zu speichern und dann den neuen Zeiger erneut an dylib zu senden, es hat funktioniert!

Meine Frage ist: Wie funktioniert die js-Engine, so dass der String Resource Pointer in js native Addon besuchbar ist, während das native Addon in dylib nicht erreichbar ist?

Antwort

0

Ich denke, das eigentliche Problem ist, dass Sie die Utf8Value in der gleichen Zeile erstellen und zerstören und versuchen, einen baumelnden Zeiger zu dereferenzieren. Es sollte stattdessen

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