libmagic.so によって提供される「ファイル」コマンド機能にアクセスするために、JNI C++ クラスを介して C++ クラスを呼び出す Java クラスがあります。
- C++ クラスはコンパイルされ、C++ main() として正常に実行されます。
- Java 1.5 および 1.6 を実行する RHEL 5 で正常に動作します。
- Java 1.5 を実行している RHEL 4 で正常に動作します。
-RHEL 4 で Java 1.6 を使用すると、seg fault 26234 がスローされます。
セグフォルト:
呼び出し時に発生 char* retptr = magic_buffer(cookie, bigbuf, 1000); char* retptr = 「適切な安全な文字列」の場合は問題ありません。が代用されます。これが、この呼び出しでセグ フォールトが発生したと結論付ける理由です。
別の呼び出し char* retptr = magic_file(cookie,”/usr/include/magic.h”); を使用します。この呼び出しは、ファイル コンテンツでいっぱいのバッファではなく、ファイルの完全修飾パス名のみを必要とする同じファイル タイプ メッセージを返すため、バッファの問題をデバッグします。また、RHEL4/java 1.6 テスト VM でセグ フォールトをスローします。したがって、問題はコード内の不良ポインターやオーバーフロー バッファーではないように思われます。
magic_buffer は libmagic.so への呼び出しです。前のコードでは、このライブラリへの他の呼び出しが成功しています。ただし、この呼び出しには lib magic データベース /usr/share/file/magic が含まれます。
C++ を実行可能ファイルとしてコンパイルし、問題のマシンで実行すると問題なく動作します。
結論は次のとおりです。
A. #4 のため、JNI の関与があります。
B. #1/#2 のため、JNI 実装の問題ではないと思います。
C. #1、#2、および #4 のため、C++ の実装の問題ではないと思います。
提案やコメントはありますか?(最初は VMWare で実行され、現在は VM の関与なしでテストされています)