JVMTI GetLocalVariableTable() 总是给出 JVMTI_ERROR_ABSENT_INFORMATION

JVMTI GetLocalVariableTable() always gives JVMTI_ERROR_ABSENT_INFORMATION

首先,我已经尝试了一段时间来寻找解决问题的方法,但没有任何用处。因此,想请教各位专家一些建议。

我正在使用 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,然后获取jmethodIDJNIGetMethodID()(当然,如果是静态方法,我用GetStaticMethodID())。每一步都检查,jclassjmethodID都是好的

(3) 然后,我尝试获取局部变量 table.

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

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

有什么想法或建议吗?

谢谢!

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

如果您可以访问原始源代码,您可以使用 javac 编译它,使用 -g 选项生成它。

如果只想获取方法签名信息,可以尝试GetMethodName function. Otherwise, you need to obtain a stack frame containing the method in question and you can retrieve the values of all the local variables using GetLocal*传入槽号