Pregunta

Estoy usando ASM para hacer instrumentación de bytecode para programas Java. Lo que estoy haciendo es simple: cuando instrumente un método, si la instrucción es un PUTFIELD, simplemente haga un DUP_X1 justo antes de la instrucción, luego visite el PUTFIELD e inyecte una llamada de función con un argumento que incluya la entrada de la pila DUP.

                public void visitFieldInsn(
                                int opcode,
                                String owner,  // owner of this field...
                                String name,
                                String desc) {

                    boolean did_dup = false;

                    if(opcode == Opcodes.PUTFIELD) {
                        if(!owner.equals("java/lang/System")) {
                            if (desc.startsWith("L")) {
                                mv.visitInsn(Opcodes.DUP_X1);                                       
                                did_dup = true;
                            }
                        }

                    } 

                    mv.visitFieldInsn(opcode, owner, name, desc);

                    if (did_dup) {
                        mv.visitVarInsn(Opcodes.ALOAD, 0);
                        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
                    }

                 }

El código tiene este aspecto ANTES y DESPUÉS de la instrumentación, respectivamente:

public void setA(ClassA classa)
{
    refA = classa;
    eyeColor = classa.eyeColor;
}


public void setA(ClassA classa)
{
    ASide.updateG(refA = classa, this);
    ASide.updateG(eyeColor = classa.eyeColor, this);
}

Pero cuando ejecuto el código instrumentado, obtengo:

java.lang.VerifyError: esperando encontrar el objeto / matriz en la pila

¿Puede ofrecerme ayuda en esto?

¿Fue útil?

Solución

Hay algunos agujeros en su instrumentación. Por ejemplo, no comprueba si está dentro del método estático, por lo que esta variable está presente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top