JVMTI在attach上获得本地变量访问功能

时间:2015-05-28 04:44:44

标签: java jvm javaagents jvmti

我正在使用JVMTI库为java编写本机代理,并尝试获取访问本地变量的功能。 在OnLoad阶段加载代理时,可以启用该功能,但是在实时阶段(OnAttach)加载时似乎是不可能的,当我尝试添加它时,我收到错误 - JVMTI_ERROR_ABSENT_INFORMATION。 / p>

这是我的OnAttach功能(C语言)

JNIEXPORT
jint
JNICALL
Agent_OnAttach(
    JavaVM *jvm,
    char *options,
    void *reserved
    )
{
    jvmtiEnv *jvmti;
    jvmtiCapabilities PotentialCap, RequestedCap;
    jvmtiError error;

    memset(&RequestedCap, 0, sizeof(RequestedCap));

    jvm->GetEnv((PVOID*)&jvmti, JVMTI_VERSION_1_0);
    jvmti->GetPotentialCapabilities(&PotentialCap);

    RequestedCap.can_access_local_variables = 1;

    error = jvmti->AddCapabilities(&RequestedCap);

    if (error != JVMTI_ERROR_NONE)
    {
        MessageBox(
            NULL,
            L"Fail to request local variable access",
            L"Native Agent",
            NULL);
    }

    return JNI_OK;
}

有没有办法在实时阶段启用本地变量访问?

由于

1 个答案:

答案 0 :(得分:0)

在HotSpot JVM中,在实时阶段无法添加访问本地变量的功能,只能在加载阶段(正如您在问题中所观察到的那样)。

您可以看到此here(已在init_onload_capabilities中启用,而不是init_always_capabilities)。