2010-12-04 5 views
0

ASM API를 사용하여 배열에 대한 액세스를 추적 할 수 있는지 알고 싶습니다.ASM을 사용하여 배열에 액세스하기

내 목표는 배열의 색인에 액세스 할시기와 언제 (이 부분이 쉬운지 - System.NanoTime())를 결정하는 것입니다. 색인을 확인하는 방법을 찾지 못했습니다.

나는 어떤 성공없이 다음 그 사용하려고 한 - visitVarInsn (정적 및 비 정적 지역 변수에 대한) (클래스의 정적 및 비 정적 바르 용) visitFieldInsn, 그리고 visitMultiANewArrayInsn - 정말 어떤 배열을 인식하지 않았다 .

답변

2

특정 색인은 명령어의 일부가 아닙니다. 피연산자 스택의 맨 위에있는 값을 들여다 보면 명령어가 어떤 인덱스를 참조하는지 알 수 있습니다. JVM reference을 참조하십시오.

그러나 피연산자 스택을 혼란스럽게하고 싶지 않으므로 배열 액세스 명령어를 발견하면 DUP 스택 맨 위 복제 (명령어가 참조하는 색인 ​​복제)를 수행 한 다음 값을 인쇄하십시오 또는 당신이 좋아하는 것을 무엇이든하고 원래의 지시를 계속 방문하십시오.

당신은 배열에 액세스하기 위해 여러 가지 지시 사항이 있다는 것을 그러나 알고 있어야합니다 :

  • aaload, iaload, laload, saload, baload, caload 및 읽기 daload
  • aastore
  • , iastore, lastore가 , sastore, bastore, castoredastore 쓰기 용
+0

고마워, 나는 그것을 줄 것이다. – RanZilber

0

nanoTime()은 배열에 액세스하는 데 약 100 배의 시간이 걸립니다. 이로 인해 결과가 비뚤어 질 수 있습니다.

ASMifier로 코드를 보았습니까? 이렇게하면 코드에 의해 트리거되는 이벤트가 표시됩니다.

BTW 예를 들어 배열 조회를 메소드 호출로 바꿀 수 있습니다.

공공 정적 INT arrayGet (INT [] INT. INT 지수)

이 당신이하는 int []를 액세스 할 때이 원하는 무엇이든 자바에 넣어 수 있습니다.

+0

결과가 엉망이 아닌 동일한 해상도에서 시간을 얻는 더 좋은 방법은 무엇입니까? – RanZilber

+0

JNI를 통해 시간을 가져 오는 대체 방법은 거의 동일한 시간이 걸린다. –

관련 문제