ASM转型找到具体的类类型(ASM transformation to find concrete

2019-10-16 18:09发布

我工作的一个项目,将跟踪的方法调用从一个类在一个包中的任何其他类别。 我能确定具体的类型,并且我也希望有一个最小的跟踪开销是很重要的。 有当探头触发没有限制; 它可以是一个方法被调用之前或之后。

ASM正在使用,但它没有要求。 该系统是从AspectJ的移动,以便允许动态附着,所以这是出来。

以下是目前的情况。 A“示踪”枚举/单接收探头(int)和处理呼叫。 这足以找到具体的呼叫类型引用类型。

@Override
void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
    Integer probeID = Tracer.INSTANCE.probes.createProbeIDAt(new Call(owner, name, desc))

    super.visitFieldInsn(GETSTATIC, "org/flightofstairs/honours/capture/agent/Tracer", "INSTANCE", "Lorg/flightofstairs/honours/capture/agent/Tracer;");
    super.visitLdcInsn(probeID)
    super.visitMethodInsn(INVOKEVIRTUAL, "org/flightofstairs/honours/capture/agent/Tracer", "probe", "(Ljava/lang/Integer;)V")

    super.visitMethodInsn(opcode, owner, name, desc);
}

我进一步去想法是某种方式得到的调用类的引用,并调用getClass()的检索具体类型。 如果堆栈包含在顶部INVOKEINTERFACE对象REF,这将是微不足道的,但任何参数所调用的方法被放置在它上面。

它不会是来计算,因为参数的数量是已知的对象引用的堆栈位置的问题,但Java提供没有办​​法从堆栈中的下复制一个参考。

有什么建议?

干杯。

Answer 1:

一个解决办法是遍历过程中记录INVOKEINTERFACEs。 最后,ASM的分析仪可用于发现推objectref到堆栈的指令,并从那里它的简单添加的getClass()和追踪代码。

的溶液在此显示。 https://gist.github.com/2795738



文章来源: ASM transformation to find concrete class type