Frage

Ich bin mit ASM, um Bytecode Instrumentierung für Java-Programme zu tun. Was ich tue, ist einfach - Wenn eine Methode instrumentiert, wenn der Befehl ein putfield ist, einfach ein DUP_X1 tun direkt vor der Anweisung, dann die putfield besuchen und einen Funktionsaufruf mit einem Argument injizieren, die die DUP'ed Stack-Eintrag enthält.

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

                 }

Der Code sieht wie folgt aus VOR und NACH Instrumentierung jeweils:

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

Aber wenn ich den instrumentierte Code ausführen, erhalte ich:

java.lang.VerifyError: Erwartung Objekt / Array auf dem Stapel finden

Können Sie bieten hat jede Hilfe zu diesem Thema?

War es hilfreich?

Lösung

Es gibt einige Löcher in der Instrumentierung. Zum Beispiel ist es nicht, wenn Sie innerhalb statische Methode sind, so dass diese Variable vorhanden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top