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
,然后获取jmethodID
到JNI
GetMethodID()
(当然,如果是静态方法,我用GetStaticMethodID()
)。每一步都检查,jclass
和jmethodID
都是好的
(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*传入槽号
首先,我已经尝试了一段时间来寻找解决问题的方法,但没有任何用处。因此,想请教各位专家一些建议。
我正在使用 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
,然后获取jmethodID
到JNI
GetMethodID()
(当然,如果是静态方法,我用GetStaticMethodID()
)。每一步都检查,jclass
和jmethodID
都是好的
(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*传入槽号