【问题标题】:JVMTI - how to get the value of a method parameter from callbackJVMTI - 如何从回调中获取方法参数的值
【发布时间】:2011-08-12 14:00:54
【问题描述】:

感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。目前,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数的值。

这个问题已经在一个较老的话题中讨论过(见How to get parameter values in a MethodEntry callback);它完全符合我的要求,所以我知道我必须使用 GetLocalObject 函数,但我不知道如何使用(主题中给出的示例已损坏)。

谁能帮我找出如何做到这一点?谢谢。

【问题讨论】:

    标签: java java-native-interface jvmti


    【解决方案1】:

    我认为您想在不知道其内容的情况下访问任意方法参数,如果不是,您能否澄清您的问题?

    请参阅JVMTI docs on local variables。

    首先,您需要确保已在功能列表中启用局部变量访问。然后,使用GetLocalVariableTable 找出可用的参数。返回的表将包含方法中每个局部变量的描述,包括参数。完成后别忘了Deallocate。

    您需要确定哪些变量是参数。您可以通过查找当前的jlocation 并消除尚不可用的局部变量来做到这一点。这不会告诉您参数顺序,但会告诉您哪些局部变量是参数。你大概可以假设槽号是正确的顺序。

    使用GetFrameLocation查找当前jlocation,遍历局部变量表,对于每个start_location小于或等于您当前位置的局部变量,将槽号和类型添加到您的列表中参数。

    对于每个参数,根据其类型调用适当的GetLocal{X} 方法。您需要当前帧的深度,您已经从 GetFrameLocation 获得。

    这应该会为您提供参数,但实施起来会很慢而且很棘手。您最好遵循指南的建议,即避免 MethodEntry 回调并改用字节码检测 (BCI)。

    【讨论】:

    • 假设我得到一个 jobject 变量,如何使用 jvmti 提取 jobject 变量的字段?
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多