4

ftestというテストプログラムがあります。テストを含む .so ファイルをロードし、そこで見つかったテストを実行します。これらのテストの 1 つは、O/RM 用の Postgres データベース ドライバーを含む .so をロードして実行します。

Postgres ドライバーがその .so ファイル (またはリンク先であるが ftest はリンクしていないファイル) で定義されている例外をスローし、テスト フレームワークによってキャッチされると、例外デストラクタが segfault をトリガーします。

この segfault は、コンパイルされた例外が (dload を使用して) 動的にロードされた .so にある場合に必ず発生します。

この種のことは、同じアーキテクチャを持つ Windows で問題なく動作します。コア ライブラリからの例外のみを使用するように自分自身を制限したくはありません。アドインは、独自の例外クラスを自由に作成し、通常どおり処理できるようにする必要があります。

例外は std::exception のサブクラスです。例外がライブラリ (libpqxx など) で定義されている場合もあります。これは、例外が制御できない場合があることを意味します。

例外は、次のようなものを使用してスローされます。

throw exception_class( exception_arguments );

そして、次を使用してキャッチされます:

catch ( std::exception &e ) {
    // handler code
}

これを機能させるために必要な特別なコンパイラ オプションはありますか? 経由で例外をスローするように切り替える必要がありthrow new exception_class( args )ますか (実際にはこれを行いたくありません)。

4

1 に答える 1

6

gccを使用していると仮定します-

dlload()を呼び出す実行可能ファイルをビルドするときに、-Wl、-Eを追加します。これにより、実行可能ファイルからすべての型情報シンボルがエクスポートされ、RTTI(例外をキャッチする場合)が正しく機能するようになります。

VC ++は文字列比較を使用してtypeinfoと照合します。その結果、dynamic_cast <>などは遅くなりますが、バイナリは小さくなります。g++はポインタ比較を使用します。

ランタイムにロードされた.soに実装された純粋な仮想インターフェイスクラスを使用しようとしたときに、同じ問題が発生しました。

ネット上に浮かんでいる主題に関連するいくつかの記事もあります。

ヘイマン、それがお役に立てば幸いです。

于 2009-06-17T08:26:20.223 に答える