首先,一段时间以来,我一直试图找到解决问题的方法,但没有任何用处。因此,我希望有专家的建议。

我正在使用JVMTI编写代理,在其中我需要获取某种方法的局部变量信息。这是我所做的摘要:

(1)打开相应的功能。

JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM *jvm, char *options, void *reserved)
{
  ...
  jvmtiCapabilities capa = {0};
  ...
  capa.can_access_local_variables = 1;
  ...
}


(2)在直播阶段(在我的情况下,是VMInit事件的处理程序),通过jclass JNI获取FindClass(),然后通过jmethodID JNI获得GetMethodID()当然,如果是静态方法,则使用GetStaticMethodID())。检查每个步骤,并且jclassjmethodID都很好。

(3)然后,我尝试获取局部变量表。

...
jvmtiLocalVariableEntry *entTab = NULL;
jint entCnt = 0;
jvmtiError errNum = jvmti->GetLocalVariableTable(mthID, &entCnt, &entTab);
...


我检查了errNum,发现它每次都是JVMTI_ERROR_ABSENT_INFORMATION。我也在其他事件处理程序中尝试过,它们的行为相同。

有什么想法或建议吗?

谢谢!

最佳答案

JVMTI_ERROR_ABSENT_INFORMATION错误指示您尝试为其加载局部变量表的方法在相应的文件中没有正确的LocalVariableTable属性。

如果您有权访问原始源代码,则可以使用javac选项使用-g对其进行编译以生成它。

如果只想获取方法签名信息,则可以尝试GetMethodName函数。否则,您需要获得一个包含所讨论方法的堆栈框架,并且可以通过传入插槽号来使用GetLocal*检索所有局部变量的值。

关于java - JVMTI GetLocalVariableTable()始终提供JVMTI_ERROR_ABSENT_INFORMATION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47877351/

10-11 17:12