java - JVMTI GetLocalVariableTable() 总是给出 JVMTI_ERROR_ABSENT_INFORMATION

标签 java jvmti

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

我正在使用 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/

相关文章:

java - 在 Eclipse 中链接文本资源

java - 如何在任何 Pane 中定位 JavaFX 形状?

java - 在移动设备上找不到 sqlite db,但可以在模拟器上运行

java - java.io.InputStreamReader 的 JPDA JDI ObjectReference

java - 为 CPU 分析附加 Java VisualVM 导致 JVMTI 错误 66

java - 如何修复 fatal error jvmti.h No such file or directory compilation terminated c code ubuntu?

java - 通过 JDBC 在 Oracle 数据库中创建表

java - Float.POSITIVE_INFINITY 和 Float.MAX_VALUE 有什么区别?

java - JVMTI Agent_OnLoad 处理程序无法创建系统属性