Вальгринд и Ява - PullRequest
       54

Вальгринд и Ява

17 голосов
/ 09 февраля 2012

Я хочу использовать Valgrind 3.7.0 для поиска утечек памяти в моем нативном коде Java.Я использую jdk1.6.0._29.

Для этого мне нужно установить флаг --trace-children = yes.Установив этот флаг, я больше не могу запускать valgrind в любом java-приложении, даже команда типа:

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 - это нормально.

Кто-нибудь знает, что яможно сделать?

Ответы [ 2 ]

17 голосов
/ 14 июня 2012

Вы должны отключить JIT для запуска JVM под valgrind, вот так:

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 согласно документации.

10 голосов
/ 28 февраля 2012

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

...