문제

Java 프로그램을 위해 바이트 코드 계측을하기 위해 ASM을 사용하고 있습니다. 내가하고있는 일은 간단합니다 - 메소드를 계측 할 때 명령어가 풋 필드 인 경우 명령 직전에 DUP_X1을 수행 한 다음 Putfield를 방문하여 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");
                    }

                 }

코드는 계측 전후에 다음과 같습니다.

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

그러나 계측 코드를 실행하면 다음과 같이받습니다.

java.lang.verifyerror : 스택에서 개체/배열을 찾을 것으로 기대합니다.

이것에 대한 도움을 제공 할 수 있습니까?

도움이 되었습니까?

해결책

계측에 약간의 구멍이 있습니다. 예를 들어, 정적 메소드 내부에 있는지 확인하지 않으므로이 변수가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top