我正在开发JVMTI代理程序,想要在方法进入和退出时识别相同的线程。我能够获取线程名称,但这还不足够。
想象一下你有一个像这样的方法:
public class Main {
public static void myMethod() {
System.out.println("doing something as " + Thread.currentThread().getName());
Thread.currentThread().setName("SomethingDifferent");
System.out.println("doing something as same thread " + Thread.currentThread().getName());
}
}
进入此方法将有一个名称,退出此线程将有不同的名称。
当使用JVMTI时:
static void JNICALL callback_on_method_entry(jvmtiEnv *jvmti, JNIEnv* env,
jthread thread, jmethodID method)
{
...
(*jvmti)->GetThreadInfo(jvmti, thread, &info);
...
}
static void JNICALL callback_on_method_exit(jvmtiEnv *jvmti, JNIEnv *env, jthread thread, jmethodID method, jboolean was_popped_by_exception, jvalue return_value)
{
...
(*jvmti)->GetThreadInfo(jvmti, thread, &info);
...
}
每个
info
都会报告不同的线程名称,我希望它们拥有相同的标识符。如何为线程获取相同的标识符?
一种解决方案是获取引用
Thread
(tid
)的字段值。如何做到这一点?我可以遍历堆栈,但我无法获取字段名称。