在JVMTI代理中访问线程局部变量

时间:2016-04-14 00:19:53

标签: java jvm jvmti

我在JVMTI代理中遇到了jthread特定事件。我怎么得到:

  • 访问线程局部变量
  • 主题名称和ID

来自JVMTI代理?

2 个答案:

答案 0 :(得分:2)

jthread是对java.lang.Thread对象的常规JNI引用。您可以使用它来访问字段并调用Thread实例上的方法,例如

    jclass threadClass = jniEnv->FindClass("java/lang/Thread");
    jmethodID methodID = jniEnv->GetMethodID(threadClass, "getId", "()J");
    jlong id = jniEnv->CallLongMethod(thread, methodID);

或者,您可以使用JVMTI Codepen函数将线程名称设为char*

线程的线程本地可以通过package-private GetThreadInfo字段进行访问。

答案 1 :(得分:1)

为了访问局部变量,您可以调用GetLocalVariabletable()来检索变量条目的表(数组),并使用槽号来获取从变量条目获得的变量,您可以调用getlocalXXX系列函数来获取变量的值,具体取决于变量签名(也是从变量表项中获得)并使用setlocalXXX()函数设置它。进一步读取对象子类即类对象,您可以在使用getlocalobject检索的作业上使用jni系列函数。