2013-03-19 1 views
2

ASM을 사용하여 수동으로 작성된 Java 바이트 코드 명령어 시퀀스의 경우 스택 상태에 액세스하는 방법이 있습니까? 예를 들어, 추천 아래 조합 :피연산자 스택에 대한 Java 바이트 코드 명령어 조합의 영향

ILOAD_0,ILOAD_1,IADD,DUP -> 1,1 

여기서 동기 명령들의 주어진 세트가 주어진 스택 유도하는지 확인 테스트 코드를 작성하는 등

assert getCurrentStackLength() == 2 

또는

assert getTopElement() == (int) 1 

등등.

+0

구체적으로 Java 바이트 코드에 대해 묻습니다. 맞습니까? – NPE

+0

예. JVM 명령어 또는 자바 바이트 코드. – shail619

+0

그럼 꽤 많이 실행하고 싶습니까? 최선의 방법은 생성 된 클래스의 메소드에서 생성하는 것이고, 스택의 상태를 출력하고 실행하는 코드를 추가하는 것입니다. 그런 다음 결과를 얻고 주장하려는 내용을 주장하십시오. –

답변

2

스택은 JVM의 내부 세부 사항이며 실제로 실제로 존재하지 않을 수 있습니다.

일반적인 JVM에는 해석과 JIT 컴파일의 두 가지 작동 모드가 있습니다. Interpertation은 스택과 로컬을 실제로 시뮬레이트합니다. JIT 컴파일은 모든 것을 기계어 코드로 컴파일하므로 피연산자 스택이나 로컬 변수 테이블 같은 것이 없습니다.

기본적으로 JVM 코드를 살펴보고 코드를 항상 해석하도록하고 디버깅 코드를 추가하여 스택을 인쇄 한 다음 다시 컴파일하고 다시 작성해야합니다. 모두. 분명히 실망한 일은 아닙니다.

그러나 더 큰 질문은 당신이 이것을 원할 이유입니다. JVM을 단위 테스트하려고합니까? 작성한 모든 코드는 테스트중인 것보다 버그가있을 가능성이 큽니다.

바이트 코드의 특정 지점에서 스택 및 지역 상태를 확인하려는 경우 정적 검증자가 필요합니다. 밖에 많이있다. 관심이 있으시면 one that's on Github이라고 적어 두었습니다.

+0

네, 저도 살펴보고 싶습니다. – shail619

+0

여기에 제가 작성한 것이 있습니다. 파이썬으로 작성되었으므로 Java에서 사용하기가 어려울 수 있습니다. 주로 정적 분석을 위해 설계되었습니다. 어쨌든 질문이 있으시면 언제든지 물어보십시오. https://github.com/Storyyeller/Krakatau – Antimony

+0

고맙습니다 @ 안티몬. JVM 문서를 자세히 살펴보면서 [StackMapTable] 속성 (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.4)을 발견했습니다.) 내가 처음에 찾고 있던 정보를 정확하게 제공하는 것 같습니다. – shail619

관련 문제