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 выполняется нормально.
Кто-нибудь знает, что я могу сделать?
Ответы
Ответ 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