2017-06-13 5 views
0

Je développe une application électronique avec addon natif sur mac, et le flux de travail de tous les composants est comme ceci: js dans electron -> appel addon.node (c + + native addon) -> appelle dylib en utilisant dlopen et dlsym.nodejs v8 garbage collection lors de l'appel addon natif

la chaîne addon get de js de cette façon:

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 

} 

Hier, nous avons trouvé un bug qui est très intéressant. C'est arrivé quand la chaîne param est très longue, pour une chaîne funcParam avec une taille d'environ 400 octets ou plus, le log in dylib montre que la longueur de funcParam est de 0 tandis que le funcName envoyé de la même manière est de longueur correcte et contenu. Après un débogage, j'ai deviné que la chaîne pouvait être garbage-collectée, donc j'ai créé un objet string pour sauvegarder le funcParam et ensuite envoyer le nouveau pointeur à dylib, ça a marché!

Ma question est: Comment le moteur js fonctionne-t-il pour que le pointeur de ressource de chaîne soit visitable dans l'addon natif de js alors qu'il n'est pas disponible dans le dylib les appels de l'addon natif?

Répondre

0

Je pense que le problème réel est que vous créez et détruisez le Utf8Value dans la même ligne et essayez de déréférencer un pointeur qui pend. Il devrait plutôt être

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