2012-02-09 47 views
12

我想使用Valgrind 3.7.0在我的Java本地代码中查找内存泄漏。我正在使用jdk1.6.0._29。Valgrind和Java

要做到这一点,我必须设置--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标志的程序很好。

有没有人有任何想法我可以做什么?

回答

8

Valgrind的陷阱和模拟(在一定程度上)的处理器,这似乎会引起JVM在弄不清你对SSE的支持和救助

我建议你尝试告诉JVM不要与SSE麻烦,你应该可以把这个关闭热点与JVM标志-XX:UseSSE=0

祝你好运! valgrinding的JVM是有点困难,因为它们有点敌对彼此

它可能也是你的版本valgrind和java我从上面运行你的命令本地和没有问题,使用valgrind 3.6.1和Java 1.6 .0_26和Java 1.7.0-B147

12

必须禁用JIT下的valgrind运行的JVM,就像这样:

valgrind java -Djava.compiler=NONE ... 

另外,如果你最终使用产生的镇压(和你最有可能的意志! ),在生成的抑制中调用堆栈的深度可能存在问题,这在JVM下运行时更有可能发生。

在最近的valgrind版本中,生成的抑制可以包含比valgrind/memcheck本身可以处理更深的调用堆栈。这个问题的症状是,valgrind意外终止,消息“堆栈跟踪中的调用者太多”。

这个问题很容易固定:建筑的valgrind之前,编辑文件coregrind/m_errormgr.c并在#定义为更大的值改变硬编码值(I使用99):

/*最大抑制中上下文的调用者数量。 */

#define VG_MAX_SUPP_CALLERS 99 

然后根据文档构建和安装valgrind。

+1

在最新的Valgrind调用者限制设置为500。 – 2014-07-03 16:07:01