我正在使用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
)。