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...

Другие вопросы по тегам