Запуск приложения JNI на виртуальной машине Sun под Valgrind - PullRequest
5 голосов
/ 16 января 2009

Sun JVM выдает МНОГО дополнительного шума при работе под Valgrind, что делает отслеживание проблем с памятью в приложении очень сложным.

Я бы хотел найти либо файл подавления, либо режим работы виртуальной машины, который удалит ложные ошибки памяти, чтобы отделить пшеницу от плевел в этой ситуации. Есть предложения?

Ответы [ 3 ]

1 голос
/ 29 января 2009

Я не могу ответить на ваш опубликованный вопрос, но не могли бы вы рассказать, какая у вас проблема?

Другими словами, можете ли вы сказать нам, если это ...

  • На уровне JNI, а не в области действия объекта JVM?
  • Использование свободной памяти?
  • Перезаписывать / перезаписывать буфер?
  • Другое повреждение памяти?

Недавно мне пришлось отлаживать Java / C, в котором возникли проблемы (после 30 с лишним минут работы), которые, как оказалось, использовали память после того, как она была свободна. Я попытался использовать dmalloc, мою собственную библиотеку утечек памяти, Valgrind, и ни одна из них не работала так, как мне нужно.

В конце концов я создал простой набор оберток вокруг free, malloc, calloc, realloc, который просто печатал адреса и размеры памяти в файле. После того, как он прервался (в GDB), я мог вернуться назад во времени и выяснить, когда была свободна память и где были ссылки, которые не были удалены.

ЕСЛИ ваша проблема в C / C ++, и вы можете перехватить ошибку в отладчике, это может сработать для вас. Да, это утомительно, но, возможно, не хуже, чем просеивать мегабайты выходных данных Valgrind.

Надеюсь, что это помогает и удачи.

1 голос
/ 25 января 2009

А как насчет профилирования этого нативного кода вне Java-приложения? Обычно код JNI является оберткой вокруг некоторой библиотеки, которая не специфична для Java. Не уверен, верно ли это для вашего конкретного случая, но если это так, то, возможно, проблемы с памятью можно изолировать, написав простую тестовую среду C или C ++ вокруг этой библиотеки?

Если ваш фреймворк находится на C ++, вы также можете предоставить свои собственные новые и удаляемые операторы и самостоятельно отслеживать использование памяти. Вам придется собирать статистику и обрабатывать ее с помощью некоторых сценариев, но она может хорошо работать.

0 голосов
/ 29 января 2009

Хотя и не такой элегантный, как valgrind (основываясь на том, что я прочитал), вы можете попробовать jmap и jhat. Эти инструменты позволяют сделать снимок запущенного процесса и посмотреть, что происходит. Я использовал эту технику для простых утечек памяти, и она работала хорошо. Однако, если проблемы с памятью вызваны не-jvm-распределением, это не поможет.

...