2017-02-10 4 views
1

줄 번호 (자바 파일에서와 같이)를 레이블 오프셋에서 가져 오는 방법이 있습니까?ASM 바이트 코드 - 레이블 오프셋에서 줄 번호 가져 오기

@Override 
    public void visitLabel(Label label){ 
    super.visitLabel(label); 
    mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", 
     "Ljava/io/PrintStream;"); 
    mv.visitLdcInsn("line " + label.getOffset() + " executed"); 
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", 
     "(Ljava/lang/String;)V", false); 
    } 

나는 각 레이블을 방문 할 때 lebel.getOffset를 인쇄 할 MethodVisitor에서 visitLabel 방법을 덮어왔다. 정수 값을 얻지 만 java 파일의 행 번호와 같지 않습니다.

+0

그렇지 않으면 디버깅이 작동하지 않습니다 (어떤 용도로 사용되는지) –

+0

레이블 오프셋에서 줄 번호를 추출하는 방법을 제안 할 수 있습니까? TIA – maddie

+0

디버깅 정보로 컴파일 한 경우 줄 번호가 있어야합니다. –

답변

0

사용자 지정 매핑을 만들어야합니다. 모든 라인 번호는 레이블을 참조하여 방문되며 모든 레이블은 해당 순서대로 방문됩니다.

  1. 줄 번호를 참조하는 모든 레이블을 기억하십시오.
  2. 방문한 레이블의 가장 최근의 줄 번호 인 레이블을 확인하십시오.
+2

불행히도 그렇게 쉬운 것은 아닙니다. ASM은 단일 코드 위치에 대해 여러 개의 레이블을 작성할 수 있으며 행 번호는 동일한 위치의 다른 모든 레이블보다 먼저 방문하도록 강요되지 않습니다. 따라서 가장 최근에 방문한 행 번호는'visitLabel '바로 다음에 방문 할 수있는 것과 비교하여 오래된 것일 수 있습니다. 'visitLineNumber' 호출이 당신의 현재'visitLabel' 바로 뒤에 오는지 당신이 미리 알 수 없기 때문에, 나는 단일 통과 솔루션을 보지 못합니다 ... – Holger