首先,我试图找到我问题的解决方案,但没有任何有用。因此,我想从专家那里提出一些建议。
我正在使用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()
)。检查每个步骤,jclass
和jmethodID
都很好。
(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*通过传递插槽号来检索所有本地变量的值。