У меня есть собственный агент JVMTI, который я прикрепляю с помощью API Java Attach. Агент в основном просто запускает Agent_OnAttach
, а затем существует. Я хотел бы передать информацию от агента к виртуальной машине, которая привязала агента. Даже просто писать на stdout виртуальной машины, которая привязала агента, было бы хорошо. Я знаю, что я мог использовать внеполосные средства, такие как сокеты или именованные каналы, но я ищу что-то встроенное.JVMTI общается с приложением vm
ответ
Вы действительно хотите общаться с 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 ...
Я хочу связаться с агентом. Агент собирает кучу данных (итерации по нескольким объектам, которые ищут конкретные). Для этой информации нужна прилагаемая виртуальная машина (а не та, в которой работает агент). –
Насколько я знаю, вы не можете напрямую общаться с агентом с вашей виртуальной машины, особенно если это другой процесс. Я думаю, что проще всего было бы создать сетевой сокет в вашем агенте и подключиться к нему со своей другой виртуальной машины. Тогда вы можете обмениваться любой информацией, которая вам нравится –
Вот что я предположил, спасибо. –