22

Valgrind 3.7.0を使用して、Javaネイティブコードのメモリリークを見つけたいと思います。jdk1.6.0._29を使用しています。

そのためには、-trace-children=yesフラグを設定する必要があります。そのフラグを設定すると、次のようなコマンドであっても、Javaアプリケーションでvalgrindを実行できなくなります。

valgrind --trace-children=yes --smc-check=all java -version

エラーメッセージが表示されます:

   Error occurred during initialization of VM
   Unknown x64 processor: SSE2 not supported

私はこのリンクを見ました:https ://bugs.kde.org/show_bug.cgi?id = 249943 、しかしそれは役に立ちませんでした。

Valgrindなしまたは--trace-childrenフラグなしでプログラムを実行することは問題ありません。

誰かが私に何ができるかについて何か考えがありますか?

4

2 に答える 2

20

valgrind で JVM を実行するには、次のように JIT を無効にする必要があります。

valgrind java -Djava.compiler=NONE ...

また、生成された抑制を使用することになった場合 (そしておそらくそうなるでしょう!)、生成された抑制のコール スタックの深さに問題が発生する可能性があります。これは、JVM で実行しているときに発生する可能性が高くなります。

valgrind の最近のバージョンでは、生成された抑制には、valgrind/memcheck 自体で処理できるよりも深い呼び出しスタックが含まれる場合があります。この問題の症状は、「スタック トレース内の呼び出し元が多すぎます」というメッセージで valgrind が予期せず終了することです。

この問題は簡単に修正できます。valgrind をビルドする前に、ファイル coregrind/m_errormgr.c を編集し、#define のハードコードされた値をより大きな値 (私は 99 を使用) に変更します。

 /* Max number of callers for context in a suppression. */

 #define VG_MAX_SUPP_CALLERS  99

次に、ドキュメントに従って valgrind をビルドしてインストールします。

于 2012-06-14T19:28:25.010 に答える
13

Valgrind はプロセッサを (ある程度) トラップしてエミュレートします。これにより、JVM が SSE のサポートについて混乱し、救済されているようです。

JVM に SSE を気にしないように指示することをお勧めします。JVM フラグを使用して、ホットスポットに対してこれをオフにできるはずです。-XX:UseSSE=0

幸運を!JVM の valgrinding は、お互いにやや敵対的であるため、少し難しい

また、valgrind と java のバージョンである可能性もあります。上記のコマンドをローカルで実行しましたが、valgrind 3.6.1 と Java 1.6.0_26 と Java 1.7.0-b147 の両方を使用して問題はありませんでした。

于 2012-02-27T21:33:59.490 に答える