2017-02-13 4 views
0

Я пытаюсь использовать ASM, чтобы подсчитать индивидуальные инструкции байткода, выполненные в рамках одной функции, для построения гистограммы. Я вижу, что есть инструмент ByCounter, который может выполнять аналогичную задачу, но у меня нет доступа к исходному коду.Выполнено выполнение отдельных индивидуальных инструкций байткода Java

Я понимаю, что библиотека байт-кода Java asm может обрабатывать классы, поля, методы, но примеры для настройки отдельной инструкции байткода не найдены (хотя из ByCounter - это оказывается возможным).

Если инструмент, подобный JVMTI, лучше подходит, то это также полезная информация!

Благодарим за помощь!

+3

Что вы собираетесь использовать эту информацию? Если вы пытаетесь профилировать или оптимизировать программу, байт-код не является тем, что JIT на самом деле закончит работать - он перепишет все это в совершенно другой по-разному собственный код во время выполнения. –

+0

Не могли бы вы просто получить доступ к ['инструкциям' метода] (http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/MethodNode.html#instructions) и проверить флажок [' size'] (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

Смежные вопросы