在 JVMTI Agent 中访问线程局部变量
Access thread local variable in JVMTI Agent
我在 JVMTI 代理中掌握了一个 jthread
特定事件。我如何获得:
- 访问线程局部变量
- 线程名称和id
从 JVMTI 代理中?
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 GetThreadInfo
函数获取线程名称 char*
。
线程的线程局部变量可以通过 package-private threadLocals
字段访问。
要访问局部变量,您可以调用 GetLocalVariabletable() 来检索变量条目的 table(数组),并使用从变量条目获得的变量的槽号,您可以调用 getlocalXXX 系列根据变量签名获取变量值的函数(也从变量 table 条目获得)并使用 setlocalXXX() 设置它 functions.To 进一步阅读对象 subclasses 即 class objects 你可以在使用 getlocalobject 检索到的 jobject 上使用 jni 系列函数。
我在 JVMTI 代理中掌握了一个 jthread
特定事件。我如何获得:
- 访问线程局部变量
- 线程名称和id
从 JVMTI 代理中?
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 GetThreadInfo
函数获取线程名称 char*
。
线程的线程局部变量可以通过 package-private threadLocals
字段访问。
要访问局部变量,您可以调用 GetLocalVariabletable() 来检索变量条目的 table(数组),并使用从变量条目获得的变量的槽号,您可以调用 getlocalXXX 系列根据变量签名获取变量值的函数(也从变量 table 条目获得)并使用 setlocalXXX() 设置它 functions.To 进一步阅读对象 subclasses 即 class objects 你可以在使用 getlocalobject 检索到的 jobject 上使用 jni 系列函数。