JVMTI在附加上获得本地变量访问能力



我正在使用JVMTI库为java编写一个本机代理,并试图获得访问本地变量的功能。当在OnLoad阶段加载代理时,该功能可以启用,但是当在活动阶段(OnAttach)加载它时,似乎是不可能的,当我试图添加它时,我得到了错误- JVMTI_ERROR_ABSENT_INFORMATION。

这是我的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;
}

是否有任何方法可以在活动阶段启用本地变量访问?

谢谢

在HotSpot JVM中,不可能在活动阶段添加访问局部变量的功能,只能在负载阶段添加(正如您在问题中观察到的)。

您可以在这里看到(它在init_onload_capabilities中启用,而不是init_always_capabilities)。

最新更新