感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。现在,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数的值。
此问题已在较早的主题中讨论过(请参阅如何在 MethodEntry 回调中获取参数值);它非常适合我正在寻找的东西,所以我知道我必须使用 GetLocalObject 函数,但我不知道如何使用(主题中给出的示例已损坏)。
谁能帮我找出如何做到这一点?谢谢。
感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。现在,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数的值。
此问题已在较早的主题中讨论过(请参阅如何在 MethodEntry 回调中获取参数值);它非常适合我正在寻找的东西,所以我知道我必须使用 GetLocalObject 函数,但我不知道如何使用(主题中给出的示例已损坏)。
谁能帮我找出如何做到这一点?谢谢。
我认为您想在不知道其内容的情况下访问任意方法参数,如果不是,您能否澄清您的问题?
请参阅有关局部变量的 JVMTI 文档。
首先,您需要确保已在功能列表中启用局部变量访问。然后,找出可用的参数GetLocalVariableTable
。返回的表将包含方法中每个局部变量的描述,包括参数。完成后不要忘记Deallocate
它。
您需要确定哪些变量是参数。您可以通过查找当前jlocation
并消除尚不可用的局部变量来做到这一点。这不会告诉您参数顺序,但会告诉您哪些局部变量是参数。您可能可以假设插槽号是正确的顺序。
查找当前jlocation
using GetFrameLocation
,遍历局部变量表,对于start_location
小于或等于当前位置的每个局部变量,将槽号和类型添加到参数列表中。
GetLocal{X}
对于每个参数,根据其类型调用相应的方法。您将需要当前帧的深度,您已经从GetFrameLocation
.
那应该可以为您提供参数,但是实施起来会很慢且很棘手。您最好遵循指南的建议,避免 MethodEntry 回调并改用字节码检测 (BCI)。