2017-02-13 2 views
0

J'essaie d'utiliser ASM pour compter les instructions de bytecode individuelles exécutées dans une seule fonction pour construire un histogramme. Je vois qu'il existe un outil ByCounter qui peut faire une tâche similaire - mais je n'ai pas accès au code source. Si je comprends bien, la bibliothèque de bytecode Java asm peut utiliser des classes d'instruments, des champs, des méthodes, mais il est impossible de trouver des exemples pour instrumenter une instruction bytecode individuelle (bien que cela soit possible depuis ByCounter).Instructions de bytecode individuel de compte de Java exécutées

Si un outil comme le JVMTI est mieux adapté, alors c'est aussi une information utile!

Merci pour votre aide!

+3

Qu'est-ce que vous prévoyez d'utiliser ces informations pour? Si vous essayez de profiler ou d'optimiser le programme, le bytecode n'est pas ce que le JIT finira par exécuter - il va réécrire le tout dans un code natif arrangé différemment à l'exécution. –

+0

Pourriez-vous simplement accéder aux ['instructions'] d'une méthode (http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/MethodNode.html#instructions) et vérifier le [' size'] (http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/InsnList.html#size--)? –

+0

@LouisWasserman Je veux voir combien d'instructions sont exécutées dans une méthode le long de chemins de code différents. Je suis d'accord que c'est une méthode imparfaite, mais c'est un début pour obtenir des mesures de base. – Mike

Répondre

0

C'est le genre de chose stupide que j'ai faite Jawa pour. Exemple:

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

Cela semble produire un histogramme des instructions * contenues * dans une méthode, pas les instructions qui sont réellement * exécutées * ... – Holger

+0

Vous avez complètement raison, c'est un mot clé qui m'a manqué. La classe 'Context()' non documentée peut être utilisée pour exécuter la méthode dans une JVM triviale, mais donnera évidemment des résultats très différents d'une vraie JVM. – TkTech

+0

@TkTech Joli petit histogramme là, merci pour le partage. Je vais vouloir un histogramme, mais à la place pour bytecode compte à l'exécution dans une méthode comme mentionné précédemment. – Mike