Valgrind和Java

Rez*_*lus 18 java java-native-interface valgrind memory-leaks sse2

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

为此,我必须设置--trace-children = yes标志.设置该标志,我不再可以在任何java应用程序上运行valgrind,甚至可以执行以下命令:

valgrind --trace-children=yes --smc-check=all java -version
Run Code Online (Sandbox Code Playgroud)

将收到错误消息:

   Error occurred during initialization of VM
   Unknown x64 processor: SSE2 not supported
Run Code Online (Sandbox Code Playgroud)

我已经看过这个链接:https://bugs.kde.org/show_bug.cgi?id = 249943,但它没用.

没有Valgrind或没有--trace-children标志运行程序就可以了.

有谁知道我能做什么?

Bil*_*llT 17

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

valgrind java -Djava.compiler=NONE ...
Run Code Online (Sandbox Code Playgroud)

此外,如果您最终使用生成的抑制(并且您很可能会!),则生成的抑制中调用堆栈的深度可能存在问题,这在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
Run Code Online (Sandbox Code Playgroud)

然后根据文档构建并安装valgrind.

  • 在最新的Valgrind呼叫者限制中,设置为500。 (3认同)

Gre*_*yer 10

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