JVMTI общаться с подключением VM
У меня есть собственный агент JVMTI, который я подключаю с помощью Java Attach API. Агент в основном просто бежит Agent_OnAttach
а затем существует. Я хотел бы передать информацию от агента к виртуальной машине, к которой подключен агент. Даже простая запись в стандартный вывод виртуальной машины, к которой подключен агент, будет в порядке. Я знаю, что могу использовать внешние средства, такие как сокеты или именованные каналы, но я ищу что-то встроенное.
1 ответ
Вы действительно хотите общаться с JVM или с приложением, работающим внутри? Если вы хотите поговорить с вашим приложением, Agent_Onload будет ранним, потому что ваше приложение еще не загружено. Вместо этого вы можете использовать событие VMInit:
void JNICALL
VMInit(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread)
Это предоставляет вам доступ к JNI и, таким образом, позволяет выполнять код Java. Вы можете использовать это, например, для установки системного свойства, которое впоследствии может быть прочитано вашими классами. Если вы хотите общаться с каким-либо конкретным классом, это событие может быть ранним, и вы можете подождать соответствующего события ClassPrepare и проверить, когда ваш класс станет доступным:
void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
JNIEnv* jni_env,
jthread thread,
jclass klass)
Если вы хотите написать в стандартный вывод, вы, конечно, можете использовать JNI для вызова System.println...