デーモンによって生成され、常に稼働している必要があるスクリプトインタープリターがあります。つまり、ダウンするとすぐに(クラッシュ、セグメンテーションフォールト、通常の終了など)、デーモンはそれを再び生成します。
dlopen
このインタプリタは、 ( )を使用してライブラリを動的に開きますlib1
。このライブラリは、他の多くのライブラリ(、、 ...)を開きlib2
ますlib3
。それらのいくつかは最初のライブラリを参照しています。そのため、呼び出しにはRTLD_GLOBAL
とRTLD_NOW
フラグを使用しています。dlopen
この時点まで、すべてがうまく機能しています。
インタプリタが強制終了またはクラッシュして再びスポーンされると、問題が発生します。もう一度dlopenを使用しますが、問題ありません...lib1
の関数を正常に呼び出すことができます。lib1
のコードでは、から関数を呼び出しますlib2
。プログラムはそこで止まります。
クラッシュしていないようです(セグメンテーション違反などはありません)。関数の最初の行には、呼び出しの直前とその他のデバッグ呼び出しがあります。最初のものが実行されます。2つ目はそうではありません。
最後の詳細:lib1
実際には、オブジェクトインスタンスを返すC++ライブラリです。すべてのモジュールのdestroyerメソッドlib1
とすべてのヘッダーを省略しています。誰かがそれを重要だと判断した場合、私はより多くの情報を与えることができます。
誰かが何が起こっているのかについて何か考えを持っていますか?
シナリオを説明するために、「擬似」コードを検討してください。
通訳者:
Lib1_obj *instance;
void interpreter_start() {
// dlopen lib1
// get lib1_creator symbol.
instance = lib1_creator();
}
void interpreter_on_event_X() {
int x = instance->method1();
printf("x = %d\n", x);
}
Lib1:
class Lib1_obj {
public:
int method1() {
printf("Check point 1.\n");
return lib2_do_something();
}
}
Lib1_obj * creator() {
return new Lib1_obj();
}
Lib2:
lib2_do_something() {
printf("Check point 2.\n");
return 1;
}
dlclose
この問題は、プロセスが強制終了されたときに呼び出すことができないという事実に関係しているのではないかと思います。dlopenメカニズムを台無しにする可能性はありますか?
どうもありがとう。