【发布时间】:2016-04-14 00:19:53
【问题描述】:
我在 JVMTI 代理中获得了一个 jthread 的特别事件。我如何获得:
- 访问线程局部变量
- 线程名称和 ID
来自 JVMTI 代理?
【问题讨论】:
我在 JVMTI 代理中获得了一个 jthread 的特别事件。我如何获得:
来自 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 字段访问线程的线程局部变量。
【讨论】:
java/lang/Thread 类当然已经加载
Thread.toString 显然创建了新对象 => 无限递归。
为了访问局部变量,您可以调用 GetLocalVariabletable() 来检索变量条目的表(数组)并使用从变量条目获得的变量的槽号,您可以调用 getlocalXXX 系列函数来获取变量的值,具体取决于变量签名(也从变量表条目获得)并使用 setlocalXXX() 函数设置它。要进一步读取对象子类,即类对象,您可以在使用 getlocalobject 检索的对象上使用 jni 系列函数。
【讨论】: