C++で書かれたさまざまなモジュールで構成されるアプリケーションがあります。
モジュールの1つは、SunGrid Engineで分散タスクを処理するためのモジュールです。 グリッドジョブの送信と監視のためにDRMAA APIを使用します。クライアントがグリッドをサポートしていない場合、ローカルマシンを使用する必要があります。
APIの共有オブジェクトlibdrmaa.soはコンパイル時にリンクされ、
私のアプリケーションを使っているクライアントがこの ".so"を持っていても問題ないですが、クライアントがそれを持っていない場合には、 共有ライブラリをロードできません。
これを避けるため、APIコールをdlsym()とdlopen()を使用して取得した関数ポインタに置き換えました。 dlopenへの呼び出しが成功せず、私の目的が達成されたら、グリッドの代わりにローカルマシンを使用できます。
問題は今、アプリケーションが小さなテストケースでうまく動作するようになりましたが、大規模なテストケースでは、動的ロードを使用する同じコードが正しく動作している間にセグメント化エラーが発生します。C動的ロードルーチンを使用する際の問題
dlsym()とdlopen()の使用中に何か不足していますか?
同じ目標を達成する他の方法はありますか?
ご協力いただければ幸いです。
ありがとう、
ええ..私はあなたに同意します..しかし、私はこれを修正する方法は?全体のコードはかなりかさばっています:(.. – sud03r
最初の段階は、seg-faultを引き起こしているものを解決することです。データへのヌルポインタアクセス、または関数ポインタへのアクセスか、それとも何か他の問題ですか?また、コアダンプ(デバッグを有効にしてコンパイルされたプログラムの)から、呼び出し点のスタックを追跡する必要があります。スタックのバックトレースが壊れている、バッファのオーバーフローが問題である可能性があります。十分な領域があるかどうかチェックせずにデータを保存しようとしましたが、そうでなければ、クラッシュ時に。幸運、これらのバグはイライラする可能性があります。 –