web-dev-qa-db-ja.com

ValgrindとJava

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=24994 、しかしそれは役に立ちませんでした。

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

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

18
RezaPlusPlus

次のように、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をビルドしてインストールします。

17
BillT

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

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

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

Valgrindのバージョンである可能性もあり、Javaローカルで上記からコマンドを実行しましたが、valgrind3.6.1と両方のJava 1.6 0_26およびJava 1.7.0-b147

10
Greg Bowyer