JVMTI - 如何从回调中获取方法参数的值

时间:2011-08-12 14:00:55

标签: java java-native-interface jvmti

由于JVMTI代理,我正在记录我的Java应用程序中的所有方法条目。现在,我可以获取每个方法的名称,但我希望能够获得方法接收的参数的值。

此问题已在较早的主题中讨论过(请参阅How to get parameter values in a MethodEntry callback);它非常适合我正在寻找的东西,所以我知道我必须使用GetLocalObject函数,但我无法弄清楚如何(主题中给出的示例被破坏)。

任何人都可以帮我找到如何做到这一点?感谢。

1 个答案:

答案 0 :(得分:1)

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

请参阅JVMTI docs on local variables

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

您需要确定哪些变量是参数。您可以通过查找当前jlocation并消除尚未提供的局部变量来实现此目的。这不会告诉你参数顺序,但它会告诉你哪些locals是参数。您可以假设插槽号是正确的顺序。

使用jlocation查找当前GetFrameLocation,迭代本地变量表,并为start_location小于或等于当前位置的每个本地变量添加插槽号并输入您的参数列表。

对于每个参数,请根据其类型调用相应的GetLocal{X}方法。您需要当前帧的深度,这是GetFrameLocation已经拥有的。

那应该可以获得你的参数,但实施起来会很慢而且很棘手。根据指南建议避免使用MethodEntry回调并使用字节码检测(BCI),你会好得多。