Запуск Java-процесса: просмотр байт-кода во время выполнения произвольного процесса

С помощью команды jmap я могу просматривать переменные и их состояние. Точно так же есть инструмент с открытым исходным кодом для сохранения байт-кода, который работает в JVM? Хотя у нас есть исходный код, бывают случаи, когда он менялся - например, с помощью АОП. Также могут быть разные версии кода во время выполнения, например, путь к классам, который имеет 2 версии jar...

Цель состоит в том, чтобы иметь возможность подключаться к процессу в моей системе и сохранять состояние JVM, включая байт-код, в файлы для дальнейшей проверки без каких-либо изменений в средстве запуска. Таким образом, мы подключаемся, когда процесс запущен, извлекаем снимок и отсоединяемся (так что мы не сильно нарушаем существующую производственную систему).

Можно использовать Open JDK или Oracle JDK для запуска приложения.


person tgkprog    schedule 03.03.2017    source источник
comment
Взгляните на этот ответ stackoverflow.com/ вопросы/35146746/.   -  person SubOptimal    schedule 03.03.2017
comment
@suboptimal, спасибо. я буду исследовать. хотя мы не используем CGLIB. увидит sun.jvm.hotspot.HSDB, хотя это не так, он говорит, что не может загрузиться, даже когда я запускаю его с помощью sudo на моем локальном компьютере.   -  person tgkprog    schedule 03.03.2017


Ответы (1)


Следующая команда работает с Oracle JDK (не удалось проверить ее с OpenJDK)

java -cp ${JDK_HOME}/lib/sa-jdi.jar \
  -Dsun.jvm.hotspot.tools.jcore.filter=sun.jvm.hotspot.tools.jcore.PackageNameFilter \
  -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=sub.optimal \
  sun.jvm.hotspot.tools.jcore.ClassDump \
  12345

Это приведет к дампу из JVM с pid 12345 всех классов из пакета sub.optimal. Классы сбрасываются в текущий каталог sub/optimal/....

примечание. Запущенный процесс и исполняемая команда java из приведенной выше должны иметь одну и ту же версию JVM. В противном случае произойдет сбой с исключением, например

VMVersionMismatchException: Supported versions are 25.112-b15. Target VM is 25.112-b6
person SubOptimal    schedule 03.03.2017