2012-05-24 3 views
1

저는 패키지 내의 클래스에서 다른 클래스로 메소드 호출을 추적하는 프로젝트에서 작업 중입니다. 구체적인 유형을 식별 할 수 있어야하며 최소한의 추적 오버 헤드를 선호하는 것이 중요합니다. 프로브가 트리거되는 시간에는 제한이 없습니다. 메서드가 호출되기 전이나 후에 호출 될 수 있습니다.구체적인 클래스 유형을 찾기위한 ASM 변환

ASM이 현재 사용되고 있지만 이에 대한 요구 사항은 없습니다. 이 시스템은 동적 인 첨부를 허용하기 위해 AspectJ에서 옮겨 가고있다.

아래는 현재 상황입니다. 'Tracer'enum/singleton은 probe (int)를 받고 호출을 처리합니다. 구체적 유형에서 참조 유형으로 호출을 찾는 것으로 충분합니다.

@Override 
void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) { 
    Integer probeID = Tracer.INSTANCE.probes.createProbeIDAt(new Call(owner, name, desc)) 

    super.visitFieldInsn(GETSTATIC, "org/flightofstairs/honours/capture/agent/Tracer", "INSTANCE", "Lorg/flightofstairs/honours/capture/agent/Tracer;"); 
    super.visitLdcInsn(probeID) 
    super.visitMethodInsn(INVOKEVIRTUAL, "org/flightofstairs/honours/capture/agent/Tracer", "probe", "(Ljava/lang/Integer;)V") 

    super.visitMethodInsn(opcode, owner, name, desc); 
} 

내 생각에 어떻게 든 호출 된 클래스에 대한 참조를 가져 와서 getClass()를 호출하여 구체적인 유형을 검색합니다. 스택에 INVOKEINTERFACE에 대해 객체 참조가 포함되어 있지만 호출 된 메소드에 대한 매개 변수가 그 위에 배치되면 사소한 문제입니다.

매개 변수 수가 알려져 있기 때문에 개체 참조의 스택 위치를 계산하는 데 문제가되지 않지만 Java에서는 스택의 아래쪽에서 참조를 복제 할 방법이 없습니다.

어떤 조언이 필요합니까?

건배.

답변

0

해결책은 순회 중 INVOKEINTERFACE를 기록하는 것입니다. 결국, ASMs Analyzer를 사용하여 objectref를 스택에 밀어 넣은 지침을 찾고, 거기에서 getClass() 및 추적 코드를 간단히 추가 할 수 있습니다.

용액을 여기에 표시합니다. https://gist.github.com/2795738

관련 문제