gpt4 book ai didi

java - JVMTI GetLocalVariableTable() 总是给出 JVMTI_ERROR_ABSENT_INFORMATION

转载 作者:行者123 更新时间:2023-12-02 02:25:20 25 4
gpt4 key购买 nike

首先,我尝试寻找解决问题的方法已经有一段时间了,但没有得到任何有用的结果。所以想请教专家一些建议。

我正在使用 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 获取 jclass FindClass(),然后通过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* 检索所有局部变量的值。通过传入槽号。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com