jvmti getlocalvariabletable()总是给出jvmti_error_absent_informat



首先,我试图找到我问题的解决方案,但没有任何有用。因此,我想从专家那里提出一些建议。

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

(1)打开相应的功能。

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

(2)在实时阶段(在我的情况下,是VMInit事件的处理程序),通过JNI FindClass()获取jclass,然后通过JNI GetMethodID()获取jmethodID(当然,如果是静态方法,我使用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属性。

如果您可以访问原始源代码,则可以使用-g选项与javac进行编译。

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

相关内容

  • 没有找到相关文章

最新更新