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=249943,但它没有用。

在没有Valgrind或没有--trace-children标志的情况下运行程序是可以的。

有没有人知道我能做什么?


答案 1

您必须禁用 JIT 才能在 valgrind 下运行 JVM,如下所示:

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。


答案 2

Valgrind捕获并模拟(在某种程度上)处理器,这似乎导致JVM对你对SSE的支持和救助感到困惑。

我建议您尝试告诉JVM不要打扰SSE,您应该能够使用JVM标志关闭热点-XX:UseSSE=0

祝你好运!评估JVM有点困难,因为它们彼此之间有些敌意

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


推荐