2012-02-09 31 views
12

JavaのネイティブコードでValgrind 3.7.0を使用してメモリリークを検出したいとします。私はjdk1.6.0._29を使用しています。Valgrind and Java

これを行うには、--trace-children = yesフラグを設定する必要があります。私は、このリンクを見てきました

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

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

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

:そのフラグを設定すると、私はもはやでもコマンドのように、任意のJavaアプリケーションでvalgrindのを実行することはできませんhttps://bugs.kde.org/show_bug.cgi?id=249943を、しかし、それは役に立たなかった。

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

私は何ができるのですか?

答えて

8

Valgrindのトラップやプロセッサ(程度)をエミュレート、これは一見、JVMは、SSEのためのあなたのサポートについての混乱を引き起こしていると私はSSEを気にしないようにJVMを伝えるあなたの試みを示唆している

を救済あなたはJVMフラグを使ってホットスポットのためにこれをオフにできるはずです-XX:UseSSE=0

幸運を祈ってください!彼らはお互いにやや敵対しているので、少し難しいです。

valgrindとjavaのあなたのバージョンかもしれません。上記のローカルからコマンドを実行しましたが、valgrind 3.6.1と両方のJava 1.6 .0_26とJava 1.7.0-b147

12

あなたはそうのように、valgrindの下のJVMを実行するために、JITを無効にする必要があります:あなたは、生成の抑止(そしてあなた最も可能性の高い意志を使用して終了すれば、また

valgrind java -Djava.compiler=NONE ... 

! )、生成された抑制の呼び出しスタックの深さに問題がある可能性があります。これは、JVMで実行しているときに発生する可能性が高くなります。

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

この問題は簡単に修正される:valgrindのを構築する前に、ファイルcoregrind/m_errormgr.cを編集して、大きな値にの#defineでハードコーディングされた値を変更する(私は99を使用):

/*マックス抑圧中の文脈に対する発呼者の数。 */

#define VG_MAX_SUPP_CALLERS 99 

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

+1

最新のValgrind発信者の制限は500に設定されています。 –