Подтвердить что ты не робот

Valgrind и Java

Я хочу использовать 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 выполняется нормально.

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

4b9b3361

Ответ 1

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

valgrind java -Djava.compiler=NONE ...

Кроме того, если вы закончите использование сгенерированных подавлений (и вы, скорее всего, будете!), может возникнуть проблема с глубиной стеков вызовов в сгенерированных подавлениях, что, скорее всего, произойдет при работе в JVM.

В последних версиях valgrind генерируемые подавления могут содержать более глубокие стеки вызовов, чем могут обрабатываться самим valgrind/memcheck. Симптом этой проблемы заключается в том, что valgrind неожиданно прекращается с сообщением "слишком много абонентов в трассировке стека".

Эта проблема легко устраняется: перед созданием valgrind отредактируйте файл coregrind/m_errormgr.c и измените твердое значение в #define на большее значение (я использую 99):

/* Максимальное количество вызовов для контекста при подавлении. */

 #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