如何在jvmti中唯一标识线程

czs*_*czs 5 java multithreading agent jvmti

我正在研究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());
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,输入此方法将有一个名称,并退出此线程具有不同的名称.

当像这样使用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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

每个info都会报告不同的线程名称,我希望它们具有相同的标识符.

如何获得线程的相同标识符?

一种解决方案是获取referenced Thread(tid)的字段值.怎么做 ?我可以通过堆迭代但​​我无法得到字段名称.

czs*_*czs 1

我终于找到了另一个简单的解决方案:

因为进入/退出回调在同一线程中运行,所以可以使用pthread_self()它并将其强制转换为unsigned int. 它tid与您在java中找到的不一样,但是尽管名称发生了变化,您仍将获得线程的唯一编号。