13

密接に関連する質問については、 MSOの質問「重複の可能性のある長いリスト—Cメモリ割り当てとオーバーランニング境界」を参照してください。


開発者環境:CentOS 4.7、Kdevelop 3.1.1、gcc 3.4.6

JNIを使​​用してC++共有ライブラリをロードするJavaテストクライアントを実行します。私のアプリケーションには3つのコンポーネントがあります。

  1. Javaクライアント
  2. JNIラッパーとして機能するC++共有ライブラリ。(私はそれを「ラッパーライブラリ」と呼びます)
  3. ビジネスオブジェクトを含むC++共有ライブラリ。(私はそれを「ビジネスライブラリ」と呼びます)

クライアントを実行すると、非常に頻繁にエラーが発生します*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***。このエラーは約10〜11回発生し、その後アプリケーションが実行されます。

私のJavaクライアントでは、最初に必要なC++ライブラリを静的コンストラクターに次のようにロードします。

static
{
System.Load("/root/Desktop/libs/businesslibrary");
System.out.println("business library loaded");
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}

「ビジネスライブラリがロードされました」というステートメントがコンソールに出力されますが、その後にエラー*** glibc...が発生します。

ラッパーライブラリのプロジェクト設定では、ビジネスライブラリが依存ライブラリとして指定されています。したがって、businesslibraryをロードする呼び出しを省略して、単に書き込むだけでも、

static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}

次に、最初にビジネスライブラリがロードされ(グローバル変数作成ログで確認)、次にラッパーライブラリがロードされます。コントロールはJavaクライアントに戻り、「ラッパーライブラリがロードされました」というステートメントがコンソールに出力されます。この後、ネイティブメソッドの呼び出しがあります。ただし、コントロールがこのネイティブメソッドの実装に到達することはありません。その前に、エラーが*** glibc...再び発生します。また、次のようなネイティブメソッド呼び出しの前に別​​のJavaクラスの静的メソッドへの呼び出しを挿入すると、

static
{
 System.Load("/root/Desktop/libs/wrapperlibrary");
 System.out.println("wrapper library loaded");
 System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string.

 native method call;

 --
 --
}

その場合、Try.temp()の出力は出力されません。

これらのアプローチの両方で問題が発生する可能性のある理由は何でしょうか。また、どのように進めればよいですか。

4

2 に答える 2

4

Java自体がライブラリとは異なるglibcに対してリンクされているか、ライブラリが異なるglibcにリンクされている可能性があります。
また、ライブラリの1つがglibcのデバッグバージョンに対してリンクしているかどうかを確認します(C ++ランタイムライブラリを使用するWindowsでの問題)。ライブラリをglibcに対して静的にリンクするか、ラッパーとビジネスライブラリを1つのライブラリに静的にリンクする可能性を排除するために試してください。

于 2010-04-06T11:46:50.340 に答える
1

私はこの不可解なエラーに数回遭遇しました。

いずれの場合も、配列の外部にある配列メンバーを参照したことが原因でした。参照はプログラム内の別の配列の範囲内にあるため、セグメンテーション違反は発生しませんでした。しかし、アレイを解放しようとすると、このエラーが発生するほど混乱してしまいました。

修正は、各配列が適切に割り当てられていること、および配列メンバーへの参照が範囲外にならないことを非常に注意深くチェックすることでした。

于 2016-06-03T17:03:45.313 に答える