2009-09-10 4 views
0

Java 프로그램 용 바이트 코드 계측을 수행하기 위해 ASM을 사용하고 있습니다. 내가하고있는 일은 간단하다. - 메소드를 인스트루먼트 할 때, 명령어가 PUTFIELD이면 명령어 바로 앞에 DUP_X1을 수행 한 다음 PUTFIELD를 방문하고 DUP의 스택 항목을 포함하는 인수로 함수 호출을 삽입한다.자바 검증기 오류를 생성하는 바이트 코드 계측

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을 : 기대하는 것은 찾을

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

       } 

는 코드는 전에 각각 계측, 후에 다음과 같다 스택에 객체/배열

제공 할 수 있습니까?

+0

수정 된 setA 메소드에 관해 불평하고 있습니까? –

+0

setA 방법에 대해 불평하지 않습니다. 마틴입니다. 예리한 관찰입니다. 내가 진정으로 불평하는 방법을 조사해야한다고 생각합니까? 내부 클래스와 관련이있는 것으로 보입니다. –

+0

이것은 내부 클래스와 관련이 있습니다 - 그러나 왜 그 것이 중요한지 확실하지 않습니다 –

답변

2

계측기에 구멍이 있습니다. 예를 들어 정적 메서드 내부에 있는지 검사하지 않으므로이 변수가 있습니다.

+0

시간이 지나면 해결되었지만 올바른 것입니다 물론 올바른 것입니다, 당신은 ASM의 저자입니다 !!! 다시 한번 감사드립니다, 나는 열렬한 팬이다. –

관련 문제