2010-12-04 34 views
0

Je voudrais savoir s'il est possible de suivre l'accès à un tableau à l'aide de l'API ASM.Visiter l'accès aux tableaux en utilisant ASM

Mon but est de déterminer quel index d'un tableau est accédé, et quand (cette partie est facile - en utilisant System.NanoTime()). Je ne pouvais pas trouver un moyen de déterminer quel index est en cours d'accès.

J'ai essayé d'utiliser ceux qui suivent sans succès - visitFieldInsn (pour vars statiques et non statiques d'une classe), visitVarInsn (pour les variables locales statiques et non statiques) et visitMultiANewArrayInsn - qui n'a pas vraiment reconnaître tout tableau .

Répondre

2

L'index particulier ne fait pas partie de l'instruction. Vous devez jeter un coup d'œil à la valeur en haut de la pile d'opérandes pour savoir à quel index se réfère l'instruction. Voir le JVM reference. Vous ne voulez pas compromettre la pile d'opérandes, par conséquent, lorsque vous rencontrez une instruction d'accès au tableau, exécutez un DUP dupliquez le haut de la pile (dupliquez l'index auquel l'instruction fait référence), puis imprimez la valeur ou faites ce que vous voulez avec et ensuite continuez en visitant l'instruction originale.

Vous devez savoir cependant qu'il ya plusieurs instructions différentes pour accéder à un tableau:

  • aaload, iaload, laload, saload, baload, caload et daload pour la lecture, et
  • aastore, iastore, lastore , sastore, , castore et dastore pour écrire
+0

Merci, je vais tenter le coup. – RanZilber

0

Cela vaut la peine de noter que nanoTime() prend environ 100 fois le temps que le tableau accède lui-même. Cela pourrait fausser considérablement les résultats.

Avez-vous essayé d'examiner votre code avec l'ASMifier? Cela devrait vous montrer quels événements sont déclenchés par votre code.

BTW vous pouvez remplacer les recherches de groupe par des appels de méthode, par ex.

public static int arrayGet (int [] int. Int index)

Cela vous permettra de mettre en Java tout ce que vous voulez faire quand un int [] est accessible.

+0

est-il un meilleur moyen d'obtenir l'heure dans la même résolution sans visser les résultats? – RanZilber

+0

AFAIK les méthodes alternatives pour obtenir du temps via JNI prennent à peu près le même temps. –