在 JVMTI Agent 中访问线程局部变量

Access thread local variable in JVMTI Agent

我在 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 字段访问。

要访问局部变量,您可以调用 GetLocalVariabletable() 来检索变量条目的 table(数组),并使用从变量条目获得的变量的槽号,您可以调用 getlocalXXX 系列根据变量签名获取变量值的函数(也从变量 table 条目获得)并使用 setlocalXXX() 设置它 functions.To 进一步阅读对象 subclasses 即 class objects 你可以在使用 getlocalobject 检索到的 jobject 上使用 jni 系列函数。