2011-11-03 3 views
4

Je cherche une bibliothèque qui va facilement me permettre de voir le bytecode donné par une méthode. Exemple:Bibliothèque qui permet une impression facile des instructions bytecode * y compris * paramètres

ALOAD 0 
INVOKEVIRTUAL ns/c.m()I 
IRETURN 

J'ai essayé à la fois:

  • ASM: Je pouvais l'obtenir pour imprimer des instructions ainsi que les paramètres, mais je vais avoir des difficultés d'emballage ma tête autour de son paradigme de visiteurs, que c'est-à-dire, le mieux que j'ai fait était d'imprimer tout un cours. BCEL: Peut l'obtenir pour imprimer les instructions, mais pas de paramètres.
  • JavaAssist: Peut l'obtenir pour imprimer les instructions, mais pas de paramètres.

Répondre

1

Parmi ceux-ci, ASM est le seul supportant la dernière version Java. En ce qui concerne les visiteurs, vous pouvez lire this tutorial. Il a été écrit pour une ancienne version de l'API ASM, mais les concepts des visiteurs sont toujours les mêmes.

+0

Merci pour le lien, mais je l'avais déjà lu. Il explique les concepts de base sur lesquels travaillent les visiteurs de l'ASM, et c'est en effet tout ce dont on a besoin pour générer de nouvelles méthodes/faire de l'instrumentation de base. D'un autre côté, il ne m'aide pas à comprendre comment faire une imprimante correcte comme je le souhaite. –

+0

Section "Transformation Bytecode" a un diagramme de séquence applicable également pour votre cas. Au lieu de ClassWriter vous avez TraceClassVisitor. Tout le reste est identique. Les visiteurs reçoivent une séquence d'événements du producteur d'événement précédent (par exemple ClassReader ou un visiteur précédent) et peuvent modifier cette séquence d'événements. Ainsi, si le visiteur traçant ne recevra pas certains types d'événements, il ne les affichera pas. –

4

Jetez un oeil à la source ASM pour TraceClassVisitor et TraceMethodVisitor pour un exemple de détails de code d'impression.

est ici une classe de test simple:

import java.io.InputStream; 
import java.io.PrintWriter; 
import java.util.Arrays; 
import org.objectweb.asm.ClassReader; 
import org.objectweb.asm.util.TraceClassVisitor; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     if (1 > args.length) { 
      System.err.println("No arguments."); 
      return; 
     } 
     InputStream is = Main.class.getResourceAsStream(args[0]); 
     ClassReader cr = new ClassReader(is); 
     cr.accept(new TraceClassVisitor(new PrintWriter(System.out)), 0); 
    } 
} 

qui sort (lorsqu'il est passé Main.class comme argument):

// class version 50.0 (50) 
// access flags 0x21 
public class Main { 

    // compiled from: Main.java 

    // access flags 0x1 
    public <init>()V 
    L0 
    LINENUMBER 11 L0 
    ALOAD 0 
    INVOKESPECIAL java/lang/Object.<init>()V 
    RETURN 
    MAXSTACK = 1 
    MAXLOCALS = 1 

    // access flags 0x9 
    public static main([Ljava/lang/String;)V throws java/lang/Exception 
    L0 
    LINENUMBER 13 L0 
    ICONST_1 
    ALOAD 0 
    ARRAYLENGTH 
    IF_ICMPLE L1 
    L2 
    LINENUMBER 14 L2 
    GETSTATIC java/lang/System.err : Ljava/io/PrintStream; 
    LDC "No arguments." 
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V 
    L3 
    LINENUMBER 15 L3 
    RETURN 
    L1 
    LINENUMBER 17 L1 
    FRAME SAME 
    LDC LMain;.class 
    ALOAD 0 
    ICONST_0 
    AALOAD 
    INVOKEVIRTUAL java/lang/Class.getResourceAsStream (Ljava/lang/String;)Ljava/io/InputStream; 
    ASTORE 1 
    L4 
    LINENUMBER 18 L4 
    NEW org/objectweb/asm/ClassReader 
    DUP 
    ALOAD 1 
    INVOKESPECIAL org/objectweb/asm/ClassReader.<init> (Ljava/io/InputStream;)V 
    ASTORE 2 
    L5 
    LINENUMBER 19 L5 
    ALOAD 2 
    NEW org/objectweb/asm/util/TraceClassVisitor 
    DUP 
    NEW java/io/PrintWriter 
    DUP 
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream; 
    INVOKESPECIAL java/io/PrintWriter.<init> (Ljava/io/OutputStream;)V 
    INVOKESPECIAL org/objectweb/asm/util/TraceClassVisitor.<init> (Ljava/io/PrintWriter;)V 
    ICONST_0 
    INVOKEVIRTUAL org/objectweb/asm/ClassReader.accept (Lorg/objectweb/asm/ClassVisitor;I)V 
    L6 
    LINENUMBER 28 L6 
    RETURN 
    MAXSTACK = 6 
    MAXLOCALS = 3 
} 
+0

Vous ne pouviez pas deviner, mais http://stackoverflow.com/questions/7984003/pretty-printing-a-method-in-asm-bytecode –

+0

N'est-ce pas une huée! On dirait que vous avez trouvé une solution. –

Questions connexes