【问题标题】:How to uniquely identify thread in jvmtijvmti中如何唯一标识线程
【发布时间】:2015-12-19 11:44:08
【问题描述】:

我正在开发 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) 的字段值。 怎么做 ?我可以遍历堆,但无法获取字段名称。

【问题讨论】:

  • ...是否有问题隐藏在某个地方,或者您只是想分享您的经验??
  • 你得看标题。但可以肯定的是,我在文章中添加了问题。
  • 这不是问题,而是陈述。另外:在您的内容中完全排除您的实际问题可以保证您得到完全零答案。这不是某种博客或论坛,人们想提供帮助,但如果你连一个简单的问题都无法提出来,他们也拒绝这样做......大多数时候

标签: java multithreading agent jvmti


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    正如您所指出的,一种解决方案是使用 GetFieldName。这需要您查找 jfieldid,这真的很烦人。

    我看到其他人这样做的方式是简单地分配他们自己的 ID 并将其存储在线程本地存储中。请参阅 UofO 的 TAU 项目中的 JavaThreadLayer.cpp,特别是 JavaThreadLayer::GetThreadId() 函数。

    【讨论】:

    • 这似乎是一个解决方案。既然回调方法(可能)在同一个线程中被调用,那么如何使用pthread_self()?我的早期测试表明它按预期工作。
    • 我不明白为什么这也不是一个完全合理的解决方案 -- 来自 JVMTI 我认为它会总是是同一个线程——有点支持调试器架构的要求,因为异步堆栈自省有点困难^^
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多