Я пишу Java-агент для взаимодействия с JVMTI. По причинам, в которые я не попаду, мне нужно использовать JVMTI (интерфейс C внутри процесса java
), а не API Java, например java.lang.instrument
или JDI. Я хотел бы иметь возможность сделать пару вещей, которые, как представляется, не поддерживаются напрямую.java agent с загрузкой jvmti во время выполнения, выгрузка изнутри
- Есть ли способ загрузить агента после того, как процесс Java уже запущен?
- Есть ли способ выгрузить Java-агент (не дожидаясь уничтожения всего процесса Java) либо из кода JVMTI, либо из-за пределов процесса? Например, могу ли я безопасно позвонить
dlclose()
из кода JVMTI, если я могу найти дескриптор для динамически загружаемого модуля?
Если эти операции не могут быть выполнены, существует ли способ передать данные агенту Java после его загрузки? Есть ли нормальный способ сделать это через некоторую утилиту командной строки Java? Если нет, могу ли я безопасно создать поток и послушать сокет, используя стандартные вызовы библиотеки C или C++ в коде для моего агента?
Если это помогает, не беспокойтесь о поддержке Windows с ответом - я беру этот проект за расширение инструмента для отладки Unix.
Примечание: Я уже видел this, но думал, что может быть какой-то нормальный способ сделать это, что не в стандарте JVMTI.