【问题标题】:Access thread local variable in JVMTI Agent访问 JVMTI 代理中的线程局部变量
【发布时间】:2016-04-14 00:19:53
【问题描述】:

我在 JVMTI 代理中获得了一个 jthread 的特别事件。我如何获得:

  • 访问线程局部变量
  • 线程名称和 ID

来自 JVMTI 代理?

【问题讨论】:

    标签: java jvm jvmti


    【解决方案1】:

    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 的 Object 的构造函数(从本机方法)获取 threadId(使用相同的代码),我遇到了thisjava/lang/Thread 类当然已经加载
    • @JigarJoshi¯\_(ツ)_/¯
    • 如果没有任何细节,我很难说出你做错了什么。
    • 抱歉,This is the code 在 Object 的构造过程中被跟踪,一旦 VM 启动后,所有 User 对象都会在此处跟踪,附加代理,如果我删除方法调用一切都很好,我很乐意提供更多详细信息,请告诉我,谢谢!
    • @JigarJoshi Thread.toString 显然创建了新对象 => 无限递归。
    【解决方案2】:

    为了访问局部变量,您可以调用 GetLocalVariabletable() 来检索变量条目的表(数组)并使用从变量条目获得的变量的槽号,您可以调用 getlocalXXX 系列函数来获取变量的值,具体取决于变量签名(也从变量表条目获得)并使用 setlocalXXX() 函数设置它。要进一步读取对象子类,即类对象,您可以在使用 getlocalobject 检索的对象上使用 jni 系列函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多