2016-12-29 12 views
0

動的ライブラリは、いくつかのCファイルを使用して作成されます。この動的ライブラリは、C++関数によって使用されます。 C関数の1つは、C++関数を呼び出します。これはJavascript関数コールバックを呼び出します。私はC + +の関数でセグメンテーションフォールトを取得しています。ここ 永続関数を使用したjavascriptのセグメント化エラー

はTEST.CPPのコードコード、TEST.Hにおいて 、ここ

#ifdef __cplusplus 
extern "C" { 
#endif 
     void cppFunc(void); 
#ifdef __cplusplus 
} 
#endif 

がTEST.Cここ

#include "test.h" 
void cFunc(void){ 
/* some code */ 
    cppFunc(); 
} 

のコードである

#include "test.h" 
static Nan::Persistent<v8::Function> callback; 
void storeFunc(const v8::FunctionCallbackInfo<v8::Value>& args){ 
    if(args[0]->IsFunction()){ 
     Local<Function> cb = Local<Function>::Cast(args[0]); 
     callback.Reset(cb); 
    } 
} 
void cppFunc(void){ 
    Isolate *isolate = Isolate::GetCurrent(); 
    Local<Function> c_back = Local<Function>::New(isolate, callback); 
    Nan::MakeCallback(Nan::GetCurrentContext()->Global(), c_back, 0, {}); 
} 
void init(Handle<Object> exports, Handle<Object> module) 
{ 
NODE_SET_METHOD(exports, "FuncStore", storeFunc); 
} 
NODE_MODULE(test, init) 

test.nodeは、「node-gyp configure build」コマンドを使用して作成されます。エラーや警告は表示されません。 "ノードtest.js" でtest.jsを実行するには、

var sample = require("./build/Release/test.node"); 
sample.FuncStore(function(){ 
    console.log("Callback has been called!!"); 
}); 

私test.jsファイルであるときcFunc()、セグメンテーションフォールトが発生した後

は)(cppFuncを呼び出します。セグメンテーションフォルトは、 "Local c_back = Local :: New(分離、コールバック);"という行で正確に起こっています。 cppFunc()内にあります。

何故その理由が考えられますか?

答えて

0

ポインタ「隔離」がNULLである可能性があります。値または無効な値を持つポインタにアクセスすると、セグメンテーションフォルトが発生する可能性があります。あなたが実行することによって、それの存在を確認する必要があります:サイドノートとして

Isolate *isolate = Isolate::GetCurrent(); 

if (isolate) { 
    //it is now safe to use isolate 
    Local<Function> c_back = Local<Function>::New(isolate, callback); 
    Nan::MakeCallback(Nan::GetCurrentContext()->Global(), c_back, 0, {}); 
} 
else { 
    //possibly generate your own warning here 
} 

を、アイソ:: GetCurrentはこれを試しhttps://github.com/nodejs/node/commit/409d413363

+0

を廃止されているようだとNULLが割り当てられている「隔離」のように思えるときcppFuncの呼びかけ()はcFunc()から来ています。 CPP関数が作成され、C関数を呼び出し、その関数がcppFunc()を呼び出すと、NULL値が割り付けられません。この動作は私にとっては少し混乱します。 例:test.cファイル内 void testFunc() { cppFunc(); } 内のtest.cpp void newFunc() { testFunc(); } 元の質問と同様にjavascriptからnewFunc()を呼び出します。 – alchemist

+0

それから、私たちはあなたが求めていた問題の原因を見つけました。隔離ポインタが適切に初期化されていません。 – diametralpitch

+0

これを適切に初期化する方法はありますか? – alchemist

関連する問題