Pergunta

Eu estou usando ASM, a fim de fazer a instrumentação bytecode para programas Java. O que estou fazendo é simples - quando instrumentar um método, se a instrução é um PUTFIELD, basta fazer um direito DUP_X1 antes da instrução, em seguida, visitar o PUTFIELD e injetar uma chamada de função com um argumento que inclui entrada do DUP'ed pilha.

                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");
                    }

                 }

Os olhares código como este antes e depois da instrumentação, 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);
}

Mas quando eu executar o código instrumentado, eu recebo:

java.lang.VerifyError: Esperando encontrar objeto / array na pilha

Você pode oferecer tem qualquer ajuda sobre isso?

Foi útil?

Solução

Há alguns buracos em sua instrumentação. Por exemplo, ele não verifica se você estiver dentro método estático, então esta variável está presente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top