2017-02-13 8 views
0

하나의 함수 내에서 실행 된 개별 바이트 코드 명령어를 계산하기 위해 ASM을 사용하려고합니다. 유사한 작업을 수행 할 수있는 ByCounter 도구가 있음을 알았지 만 소스 코드에 액세스 할 수 없습니다.자바 카운트 개별 바이트 코드 명령어가 실행되었습니다.

Java 클래스 라이브러리는 클래스, 필드, 메소드를 구현할 수 있지만 개별 바이트 코드 명령어를 인스트루먼트하기위한 예제는 찾을 수 없습니다 (ByCounter에서 가능하지만 가능할 수도 있음).

JVMTI와 같은 도구가 더 적합한 경우 유용한 정보입니다.

도움 주셔서 감사합니다.

+3

? 프로그램을 프로파일 링하거나 최적화하려고한다면, 바이트 코드는 실제로 JIT가 실행을 끝내는 것이 아닙니다. 실행시 완전히 다른 배열의 원시 코드로 모든 것을 다시 작성합니다. –

+0

메소드의 ['instructions'] (http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/MethodNode.html#instructions)에 액세스하고 [' 크기'] (http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/InsnList.html#size--)? –

+0

@LouisWasserman 다른 코드 경로를 따라 메소드에서 얼마나 많은 명령어가 실행되는지보고 싶습니다. 나는 그것이 불완전한 방법이라는 데 동의하지만 몇 가지 기본 척도를 얻는 것은 시작이다. – Mike

답변

0

이것은 바보 같은 일을 내가 만든 Jawa입니다. 예 :

당신이이 정보를 사용할 계획입니까
from collections import Counter 
from jawa.cf import ClassFile 
import pandas 


with open('tests/data/HelloWorldDebug.class', 'rb') as fin: 
    cf = ClassFile(fin) 

    method = cf.methods.find_one(name='<init>') 

    ins = Counter(i.mnemonic for i in method.code.disassemble()) 

    df = pandas.DataFrame.from_dict(ins, orient='index') 
    fig = df.plot(kind='bar').get_figure() 
    fig.savefig('example.png') 

histogram

+0

이것은 실제로 * 실행 된 명령이 아닌, 메소드에 포함 된 명령어 *의 히스토그램을 생성하는 것으로 보입니다. ... – Holger

+0

당신이 완전히 옳다는 것은 내가 놓친 핵심 단어입니다. 문서화되지 않은'Context()'클래스는 사소한 JVM에서 메소드를 실행하는 데 사용될 수 있지만, 분명히 실제 JVM과 다른 결과를 줄 것입니다. – TkTech

+0

@TkTech 좋은 작은 히스토그램 거기, 공유 주셔서 감사합니다. 히스토그램을 원하지만 이전에 언급 한 메서드 내에서 런타임에 바이트 코드를 계산할 수 있습니다. – Mike