0

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 がスローされます。

セグフォルト:

  1. 呼び出し時に発生 char* retptr = magic_buffer(cookie, bigbuf, 1000); char* retptr = 「適切な安全な文字列」の場合は問題ありません。が代用されます。これが、この呼び出しでセグ フォールトが発生したと結論付ける理由です。

  2. 別の呼び出し char* retptr = magic_file(cookie,”/usr/include/magic.h”); を使用します。この呼び出しは、ファイル コンテンツでいっぱいのバッファではなく、ファイルの完全修飾パス名のみを必要とする同じファイル タイプ メッセージを返すため、バッファの問題をデバッグします。また、RHEL4/java 1.6 テスト VM でセグ フォールトをスローします。したがって、問題はコード内の不良ポインターやオーバーフロー バッファーではないように思われます。

  3. magic_buffer は libmagic.so への呼び出しです。前のコードでは、このライブラリへの他の呼び出しが成功しています。ただし、この呼び出しには lib magic データベース /usr/share/file/magic が含まれます。

  4. C++ を実行可能ファイルとしてコンパイルし、問題のマシンで実行すると問題なく動作します。

結論は次のとおりです。

A. #4 のため、JNI の関与があります。

B. #1/#2 のため、JNI 実装の問題ではないと思います。

C. #1、#2、および #4 のため、C++ の実装の問題ではないと思います。

提案やコメントはありますか?(最初は VMWare で実行され、現在は VM の関与なしでテストされています)

4

1 に答える 1

0

私の最初の提案は、純粋な Java の代替手段を見つけようとすることです。 このページには、いくつかの代替案がリストされています。Apache Tika と JMimeMagic は有望に見えます。

2 つ目の提案は、別のプロセスでコマンドProcessを実行しfile、コマンドの標準出力から必要な情報を取得するために使用することです。これを 1 秒間に何百回も実行する必要がある場合、(エヘム) パフォーマンスの問題が発生する可能性がありますが、たまに使用する場合は問題ありません。

于 2010-01-20T22:18:31.330 に答える