【问题标题】:How to communicate with jvmti agent attached on a running JVM如何与附加在正在运行的 JVM 上的 jvmti 代理进行通信
【发布时间】:2015-04-12 02:11:09
【问题描述】:

我想知道如何与使用附加 API 附加在正在运行的 JVM 上的 jvmti 代理进行通信。当我说通信时,我的意思是:我想调用位于我的 jvmti 代理上的本机函数,这些函数将返回我之前用代理“感染”的正在运行的 JVM 的数据(如字段值)。

这是代理;我还没有添加原生函数:

#include <jvmti.h>

JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved);
jvmtiEnv* create_jvmti_env(JavaVM* vm);
JNIEnv* create_jni_env(JavaVM* vm);
void init_jvmti_capabilities(jvmtiEnv* env);

JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved) {
    jvmtiEnv* jvmti = create_jvmti_env(vm);
    init_jvmti_capabilities(jvmti);
    JNIEnv* jni = create_jni_env(vm);
    return JNI_OK;
}

jvmtiEnv* create_jvmti_env(JavaVM* vm) {
    jvmtiEnv* env;
    vm->GetEnv((void **) &env, JVMTI_VERSION_1_2);
    return env;
}

JNIEnv* create_jni_env(JavaVM* vm) {
    JNIEnv* env;
    vm->GetEnv( (void **) &env, JNI_VERSION_1_8);
    return env;
}

void init_jvmti_capabilities(jvmtiEnv* env) {
    jvmtiCapabilities capabilities;
    env->GetPotentialCapabilities( &capabilities);
    env->AddCapabilities( &capabilities);
}

【问题讨论】:

    标签: java jvmti


    【解决方案1】:

    我将如何使用附加 API 与我附加在正在运行的 JVM 上的 jvmti 代理进行通信。

    如果我正确理解您在这里所做的事情,那么您的外部应用程序如何与代理通信完全取决于您,但实现它也取决于您......从设计或选择有线协议开始你将要使用。

    【讨论】:

      【解决方案2】:

      您可以尝试使用 JNI 注册本机方法。我还没有测试过,但你可以试试这样的:

      向应该与您的 JVMTI 代理通信的类添加本机方法:

      public native MyResponseType myNativeMethod (MyRequestType obj);
      

      然后使用 JNI 将此 Java 方法绑定到您的 JVMTI 代理的某个方法:

      static JNINativeMethod methods[] = {
          {"myNativeMethod", "(Lmy/package/MyRequestType;)Lmy/package/MyResponseType;", (void *)&native_method}
      }; 
      
      jni->RegisterNatives(cls, methods, 1);
      

      其中cls 是对包含您的本机方法的类的 jclass 引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        相关资源
        最近更新 更多