Instrumentierung
Instrumentierung— Das Werkzeug der Werkzeugmacher —
Bernd Muller
OstfaliaHochschule Braunschweig/Wolfenbuttel
,Bernd Muller 1/46
Instrumentierung
Agenda
I Instrumentierung und Agenten
I Redefinition und Retransformation
I Beispiele
,Bernd Muller 2/46
Instrumentierung
Referent
Vorstellung Referent
I Prof. Informatik (Ostfalia, HS Braunschweig/Wolfenbuttel)
I Buchautor (JSF, Seam, JPA, ...)
I Mitglied EGs JSR 344 (JSF 2.2) und JSR 338 (JPA 2.1)
I Geschaftsfuhrer PMST GmbH
I . . .
I @berndmuller
,Bernd Muller 3/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung und Agenten
oder
Alt, machtig, aber unbekannt . . .
,Bernd Muller 4/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Das Package java.lang.instrument
I Das Package java.lang.instrument wurde mit Java 5eingefuhrt
I Java-Doc:
”. . . Provides services that allow Java programming language
agents to instrument programs running on the JVM. Themechanism for instrumentation is modification of thebyte-codes of methods. . . .“
I Verwendungsmoglichkeiten: Monitoring, JPA-Provider,Code-Coverage, . . .
I Allgemein: Sinnvolles Verhalten, das nicht im Code steht,nachtraglich und nur bei Bedarf einbauen
,Bernd Muller 5/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Das Package java.lang.instrument
I Das Package java.lang.instrument wurde mit Java 5eingefuhrt
I Java-Doc:
”. . . Provides services that allow Java programming language
agents to instrument programs running on the JVM. Themechanism for instrumentation is modification of thebyte-codes of methods. . . .“
I Verwendungsmoglichkeiten: Monitoring, JPA-Provider,Code-Coverage, . . .
I Allgemein: Sinnvolles Verhalten, das nicht im Code steht,nachtraglich und nur bei Bedarf einbauen
,Bernd Muller 5/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Das Package java.lang.instrument
I Das Package java.lang.instrument wurde mit Java 5eingefuhrt
I Java-Doc:
”. . . Provides services that allow Java programming language
agents to instrument programs running on the JVM. Themechanism for instrumentation is modification of thebyte-codes of methods. . . .“
I Verwendungsmoglichkeiten: Monitoring, JPA-Provider,Code-Coverage, . . .
I Allgemein: Sinnvolles Verhalten, das nicht im Code steht,nachtraglich und nur bei Bedarf einbauen
,Bernd Muller 5/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Das Package java.lang.instrument
I Das Package java.lang.instrument wurde mit Java 5eingefuhrt
I Java-Doc:
”. . . Provides services that allow Java programming language
agents to instrument programs running on the JVM. Themechanism for instrumentation is modification of thebyte-codes of methods. . . .“
I Verwendungsmoglichkeiten: Monitoring, JPA-Provider,Code-Coverage, . . .
I Allgemein: Sinnvolles Verhalten, das nicht im Code steht,nachtraglich und nur bei Bedarf einbauen
,Bernd Muller 5/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Agenten
I Deployed als Jar-File
I Attribut im Manifest definiert die Agenten-KlasseI Alternativen, um Agent zu starten
I Auf Kommandozeile bei VM-Start (zwingend erforderlich furKommandozeilenimplementierungen)
I Nach VM-Start, z.B. durch nicht naher spezifiziertes Binden(optional und implementation dependent)
I Artikel Java Magazin 3/2015: James Bond lasst grußen -Geheimagenten (oder geheime Agenten) bei ihrer Arbeit
,Bernd Muller 6/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Agenten
I Deployed als Jar-File
I Attribut im Manifest definiert die Agenten-Klasse
I Alternativen, um Agent zu starten
I Auf Kommandozeile bei VM-Start (zwingend erforderlich furKommandozeilenimplementierungen)
I Nach VM-Start, z.B. durch nicht naher spezifiziertes Binden(optional und implementation dependent)
I Artikel Java Magazin 3/2015: James Bond lasst grußen -Geheimagenten (oder geheime Agenten) bei ihrer Arbeit
,Bernd Muller 6/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Agenten
I Deployed als Jar-File
I Attribut im Manifest definiert die Agenten-KlasseI Alternativen, um Agent zu starten
I Auf Kommandozeile bei VM-Start (zwingend erforderlich furKommandozeilenimplementierungen)
I Nach VM-Start, z.B. durch nicht naher spezifiziertes Binden(optional und implementation dependent)
I Artikel Java Magazin 3/2015: James Bond lasst grußen -Geheimagenten (oder geheime Agenten) bei ihrer Arbeit
,Bernd Muller 6/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Agenten
I Deployed als Jar-File
I Attribut im Manifest definiert die Agenten-KlasseI Alternativen, um Agent zu starten
I Auf Kommandozeile bei VM-Start (zwingend erforderlich furKommandozeilenimplementierungen)
I Nach VM-Start, z.B. durch nicht naher spezifiziertes Binden(optional und implementation dependent)
I Artikel Java Magazin 3/2015: James Bond lasst grußen -Geheimagenten (oder geheime Agenten) bei ihrer Arbeit
,Bernd Muller 6/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Agenten
I Deployed als Jar-File
I Attribut im Manifest definiert die Agenten-KlasseI Alternativen, um Agent zu starten
I Auf Kommandozeile bei VM-Start (zwingend erforderlich furKommandozeilenimplementierungen)
I Nach VM-Start, z.B. durch nicht naher spezifiziertes Binden(optional und implementation dependent)
I Artikel Java Magazin 3/2015: James Bond lasst grußen -Geheimagenten (oder geheime Agenten) bei ihrer Arbeit
,Bernd Muller 6/46
Instrumentierung
Instrumentierung und Agenten
Instrumentierung in Java 5
Agenten
I Deployed als Jar-File
I Attribut im Manifest definiert die Agenten-KlasseI Alternativen, um Agent zu starten
I Auf Kommandozeile bei VM-Start (zwingend erforderlich furKommandozeilenimplementierungen)
I Nach VM-Start, z.B. durch nicht naher spezifiziertes Binden(optional und implementation dependent)
I Artikel Java Magazin 3/2015: James Bond lasst grußen -Geheimagenten (oder geheime Agenten) bei ihrer Arbeit
,Bernd Muller 6/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Pre-Main
oder
Gibt es ein Leben vor main() ?
,Bernd Muller 7/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Syntax: -javaagent:jarpath[=options]
I Option mehrfach verwendbar, damit mehrere AgentenI Manifest des Agenten-Jars muss Attribut Premain-Class
enthaltenI Diese Agentenklasse muss premain()-Methode enthaltenI Nachdem VM initialisiert ist, werden alle
premain()-Methoden in der Reihenfolge der Optionenaufgerufen, dann die main()-Methode
I Zwei mogliche Signaturen:
public static void premain(String agentArgs ,
Instrumentation inst);
public static void premain(String agentArgs );
I Aufruf der zweiten Alternative nur, falls erste nicht existiert
,Bernd Muller 8/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Syntax: -javaagent:jarpath[=options]I Option mehrfach verwendbar, damit mehrere Agenten
I Manifest des Agenten-Jars muss Attribut Premain-Classenthalten
I Diese Agentenklasse muss premain()-Methode enthaltenI Nachdem VM initialisiert ist, werden alle
premain()-Methoden in der Reihenfolge der Optionenaufgerufen, dann die main()-Methode
I Zwei mogliche Signaturen:
public static void premain(String agentArgs ,
Instrumentation inst);
public static void premain(String agentArgs );
I Aufruf der zweiten Alternative nur, falls erste nicht existiert
,Bernd Muller 8/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Syntax: -javaagent:jarpath[=options]I Option mehrfach verwendbar, damit mehrere AgentenI Manifest des Agenten-Jars muss Attribut Premain-Class
enthalten
I Diese Agentenklasse muss premain()-Methode enthaltenI Nachdem VM initialisiert ist, werden alle
premain()-Methoden in der Reihenfolge der Optionenaufgerufen, dann die main()-Methode
I Zwei mogliche Signaturen:
public static void premain(String agentArgs ,
Instrumentation inst);
public static void premain(String agentArgs );
I Aufruf der zweiten Alternative nur, falls erste nicht existiert
,Bernd Muller 8/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Syntax: -javaagent:jarpath[=options]I Option mehrfach verwendbar, damit mehrere AgentenI Manifest des Agenten-Jars muss Attribut Premain-Class
enthaltenI Diese Agentenklasse muss premain()-Methode enthalten
I Nachdem VM initialisiert ist, werden allepremain()-Methoden in der Reihenfolge der Optionenaufgerufen, dann die main()-Methode
I Zwei mogliche Signaturen:
public static void premain(String agentArgs ,
Instrumentation inst);
public static void premain(String agentArgs );
I Aufruf der zweiten Alternative nur, falls erste nicht existiert
,Bernd Muller 8/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Syntax: -javaagent:jarpath[=options]I Option mehrfach verwendbar, damit mehrere AgentenI Manifest des Agenten-Jars muss Attribut Premain-Class
enthaltenI Diese Agentenklasse muss premain()-Methode enthaltenI Nachdem VM initialisiert ist, werden alle
premain()-Methoden in der Reihenfolge der Optionenaufgerufen, dann die main()-Methode
I Zwei mogliche Signaturen:
public static void premain(String agentArgs ,
Instrumentation inst);
public static void premain(String agentArgs );
I Aufruf der zweiten Alternative nur, falls erste nicht existiert
,Bernd Muller 8/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Syntax: -javaagent:jarpath[=options]I Option mehrfach verwendbar, damit mehrere AgentenI Manifest des Agenten-Jars muss Attribut Premain-Class
enthaltenI Diese Agentenklasse muss premain()-Methode enthaltenI Nachdem VM initialisiert ist, werden alle
premain()-Methoden in der Reihenfolge der Optionenaufgerufen, dann die main()-Methode
I Zwei mogliche Signaturen:
public static void premain(String agentArgs ,
Instrumentation inst);
public static void premain(String agentArgs );
I Aufruf der zweiten Alternative nur, falls erste nicht existiert
,Bernd Muller 8/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Optional agentmain()-Methode zur Verwendung nachVM-Start
I Falls Start uber Kommandozeile, wird agentmain() nichtaufgerufen
I Agent wird uber System-Class-Loader geladenI Jeder Agent bekommt seine Parameter uber
agentArgs-Parameter als ein String, d.h. Agent muss selbstparsen
I Falls Agent nicht geladen werden kann oderpremain()-Methode nicht existert, wird VM beendet
I Exceptions der premain()-Methode fuhren ebenfalls zumBeenden der VM
,Bernd Muller 9/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Optional agentmain()-Methode zur Verwendung nachVM-Start
I Falls Start uber Kommandozeile, wird agentmain() nichtaufgerufen
I Agent wird uber System-Class-Loader geladenI Jeder Agent bekommt seine Parameter uber
agentArgs-Parameter als ein String, d.h. Agent muss selbstparsen
I Falls Agent nicht geladen werden kann oderpremain()-Methode nicht existert, wird VM beendet
I Exceptions der premain()-Methode fuhren ebenfalls zumBeenden der VM
,Bernd Muller 9/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Optional agentmain()-Methode zur Verwendung nachVM-Start
I Falls Start uber Kommandozeile, wird agentmain() nichtaufgerufen
I Agent wird uber System-Class-Loader geladen
I Jeder Agent bekommt seine Parameter uberagentArgs-Parameter als ein String, d.h. Agent muss selbstparsen
I Falls Agent nicht geladen werden kann oderpremain()-Methode nicht existert, wird VM beendet
I Exceptions der premain()-Methode fuhren ebenfalls zumBeenden der VM
,Bernd Muller 9/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Optional agentmain()-Methode zur Verwendung nachVM-Start
I Falls Start uber Kommandozeile, wird agentmain() nichtaufgerufen
I Agent wird uber System-Class-Loader geladenI Jeder Agent bekommt seine Parameter uber
agentArgs-Parameter als ein String, d.h. Agent muss selbstparsen
I Falls Agent nicht geladen werden kann oderpremain()-Methode nicht existert, wird VM beendet
I Exceptions der premain()-Methode fuhren ebenfalls zumBeenden der VM
,Bernd Muller 9/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Optional agentmain()-Methode zur Verwendung nachVM-Start
I Falls Start uber Kommandozeile, wird agentmain() nichtaufgerufen
I Agent wird uber System-Class-Loader geladenI Jeder Agent bekommt seine Parameter uber
agentArgs-Parameter als ein String, d.h. Agent muss selbstparsen
I Falls Agent nicht geladen werden kann oderpremain()-Methode nicht existert, wird VM beendet
I Exceptions der premain()-Methode fuhren ebenfalls zumBeenden der VM
,Bernd Muller 9/46
Instrumentierung
Instrumentierung und Agenten
Pre-Main
Agentenstart uber Kommandozeile
I Optional agentmain()-Methode zur Verwendung nachVM-Start
I Falls Start uber Kommandozeile, wird agentmain() nichtaufgerufen
I Agent wird uber System-Class-Loader geladenI Jeder Agent bekommt seine Parameter uber
agentArgs-Parameter als ein String, d.h. Agent muss selbstparsen
I Falls Agent nicht geladen werden kann oderpremain()-Methode nicht existert, wird VM beendet
I Exceptions der premain()-Methode fuhren ebenfalls zumBeenden der VM
,Bernd Muller 9/46
Instrumentierung
Instrumentierung und Agenten
Attach-API
Das Attach-API
oder
Wie rede ich mit einer VM ?
,Bernd Muller 10/46
Instrumentierung
Instrumentierung und Agenten
Attach-API
Instrumentation-Package
”. . . Implementations may also support a mechanism to start
agents some time after the VM has started. For example, animplementation may provide a mechanism that allows a tool toattach to a running application, and initiate the loading of thetool’s agent into the running application. The details as to how theload is initiated, is implementation dependent.“
I Achtung: implementierungsabhangig
I Aber: in HotSpot, JRockit, IBM, SAP vorhanden
I Schnittstelle ist die abstrakte Klasse VirtualMachine imPackage com.sun.tools.attach, enthalten in tools.jar
,Bernd Muller 11/46
Instrumentierung
Instrumentierung und Agenten
Attach-API
Instrumentation-Package
”. . . Implementations may also support a mechanism to start
agents some time after the VM has started. For example, animplementation may provide a mechanism that allows a tool toattach to a running application, and initiate the loading of thetool’s agent into the running application. The details as to how theload is initiated, is implementation dependent.“
I Achtung: implementierungsabhangig
I Aber: in HotSpot, JRockit, IBM, SAP vorhanden
I Schnittstelle ist die abstrakte Klasse VirtualMachine imPackage com.sun.tools.attach, enthalten in tools.jar
,Bernd Muller 11/46
Instrumentierung
Instrumentierung und Agenten
Attach-API
Java-Doc Klasse VirtualMachine
”A VirtualMachine represents a Java virtual machine to which this
Java virtual machine has attached. The Java virtual machine towhich it is attached is sometimes called the target virtual machine,or target VM. An application (typically a tool such as amanagemet console or profiler) uses a VirtualMachine to load anagent into the target VM. “
I Methode attach(<pid>)
Fabrikmethode, um angebundene Instanz zu bekommen
I Methode loadAgent(<agent>,<args>)
um Agent zu laden und zu starten (Methode agentmain())
,Bernd Muller 12/46
Instrumentierung
Instrumentierung und Agenten
Attach-API
Java-Doc Klasse VirtualMachine
”A VirtualMachine represents a Java virtual machine to which this
Java virtual machine has attached. The Java virtual machine towhich it is attached is sometimes called the target virtual machine,or target VM. An application (typically a tool such as amanagemet console or profiler) uses a VirtualMachine to load anagent into the target VM. “
I Methode attach(<pid>)
Fabrikmethode, um angebundene Instanz zu bekommen
I Methode loadAgent(<agent>,<args>)
um Agent zu laden und zu starten (Methode agentmain())
,Bernd Muller 12/46
Instrumentierung
Instrumentierung und Agenten
Attach-API
Agent mit agentmain()
I Der Agent
public static void agentmain(String agentArgs ,
Instrumentation inst);
public static void agentmain(String agentArgs );
I Im Manifest Attribut Agent-Class auf Klassennamen desAgenten setzten
,Bernd Muller 13/46
Instrumentierung
Retransformation und Redefinition
Retransformation und Redefinition
oder
Andern oder neu machen ?
,Bernd Muller 14/46
Instrumentierung
Retransformation und Redefinition
Retransformation und Redefinition
I Moglichkeit, bereits geladene Klassen ganz oder teilweise zuersetzen
I Beides optionale VM-FunktionenI void redefineClasses(ClassDefinition... defs)
”Redefine the supplied set of classes using the supplied class
files. This method is used to replace the definition of a classwithout reference to the existing class file bytes, as one mightdo when recompiling from source for fix-and-continuedebugging.“
I void retransformClasses(Class<?>... classes)
”Retransform the supplied set of classes. This function
facilitates the instrumentation of already loaded classes.“
,Bernd Muller 15/46
Instrumentierung
Retransformation und Redefinition
Retransformation und Redefinition
I Moglichkeit, bereits geladene Klassen ganz oder teilweise zuersetzen
I Beides optionale VM-Funktionen
I void redefineClasses(ClassDefinition... defs)
”Redefine the supplied set of classes using the supplied class
files. This method is used to replace the definition of a classwithout reference to the existing class file bytes, as one mightdo when recompiling from source for fix-and-continuedebugging.“
I void retransformClasses(Class<?>... classes)
”Retransform the supplied set of classes. This function
facilitates the instrumentation of already loaded classes.“
,Bernd Muller 15/46
Instrumentierung
Retransformation und Redefinition
Retransformation und Redefinition
I Moglichkeit, bereits geladene Klassen ganz oder teilweise zuersetzen
I Beides optionale VM-FunktionenI void redefineClasses(ClassDefinition... defs)
”Redefine the supplied set of classes using the supplied class
files. This method is used to replace the definition of a classwithout reference to the existing class file bytes, as one mightdo when recompiling from source for fix-and-continuedebugging.“
I void retransformClasses(Class<?>... classes)
”Retransform the supplied set of classes. This function
facilitates the instrumentation of already loaded classes.“
,Bernd Muller 15/46
Instrumentierung
Retransformation und Redefinition
Retransformation und Redefinition
I Moglichkeit, bereits geladene Klassen ganz oder teilweise zuersetzen
I Beides optionale VM-FunktionenI void redefineClasses(ClassDefinition... defs)
”Redefine the supplied set of classes using the supplied class
files. This method is used to replace the definition of a classwithout reference to the existing class file bytes, as one mightdo when recompiling from source for fix-and-continuedebugging.“
I void retransformClasses(Class<?>... classes)
”Retransform the supplied set of classes. This function
facilitates the instrumentation of already loaded classes.“
,Bernd Muller 15/46
Instrumentierung
Retransformation und Redefinition
Retransformation
Retransformation
I Attribut Can-Retransform-Classes im Manifest auf truesetzen
I Transformer registrieren:Instrumentation.addTransformer(ClassFileTransformer
transformer)
I Entsprechende Methode aufrufen:Instrumentation.retransformClasses(Class<?>...
classes)
,Bernd Muller 16/46
Instrumentierung
Retransformation und Redefinition
Retransformation
Retransformation
I Attribut Can-Retransform-Classes im Manifest auf truesetzen
I Transformer registrieren:Instrumentation.addTransformer(ClassFileTransformer
transformer)
I Entsprechende Methode aufrufen:Instrumentation.retransformClasses(Class<?>...
classes)
,Bernd Muller 16/46
Instrumentierung
Retransformation und Redefinition
Retransformation
Retransformation
I Attribut Can-Retransform-Classes im Manifest auf truesetzen
I Transformer registrieren:Instrumentation.addTransformer(ClassFileTransformer
transformer)
I Entsprechende Methode aufrufen:Instrumentation.retransformClasses(Class<?>...
classes)
,Bernd Muller 16/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Redefinition
I Attribut Can-Redefine-Classes im Manifest auf truesetzen
I Entsprechende Methode aufrufen:Instrumentation.redefineClasses(Class<?>...
classes)
,Bernd Muller 17/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Redefinition
I Attribut Can-Redefine-Classes im Manifest auf truesetzen
I Entsprechende Methode aufrufen:Instrumentation.redefineClasses(Class<?>...
classes)
,Bernd Muller 17/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Auszug aus Java-Doc fur redefineClasses()
I If a redefined method has active stack frames, those activeframes continue to run the bytecodes of the original method.The redefined method will be used on new invokes.
I This method does not cause any initialization except thatwhich would occur under the customary JVM semantics. Inother words, redefining a class does not cause its initializers tobe run. The values of static variables will remain as they wereprior to the call.
I Instances of the redefined class are not affected.
,Bernd Muller 18/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Auszug aus Java-Doc fur redefineClasses()
I If a redefined method has active stack frames, those activeframes continue to run the bytecodes of the original method.The redefined method will be used on new invokes.
I This method does not cause any initialization except thatwhich would occur under the customary JVM semantics. Inother words, redefining a class does not cause its initializers tobe run. The values of static variables will remain as they wereprior to the call.
I Instances of the redefined class are not affected.
,Bernd Muller 18/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Auszug aus Java-Doc fur redefineClasses()
I If a redefined method has active stack frames, those activeframes continue to run the bytecodes of the original method.The redefined method will be used on new invokes.
I This method does not cause any initialization except thatwhich would occur under the customary JVM semantics. Inother words, redefining a class does not cause its initializers tobe run. The values of static variables will remain as they wereprior to the call.
I Instances of the redefined class are not affected.
,Bernd Muller 18/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Auszug aus Java-Doc fur redefineClasses() (cont’d)
I The redefinition may change method bodies, the constantpool and attributes. The redefinition must not add, remove orrename fields or methods, change the signatures of methods,or change inheritance. These restrictions maybe be lifted infuture versions.
I The class file bytes are not checked, verified and installed untilafter the transformations have been applied, if the resultantbytes are in error this method will throw an exception.
,Bernd Muller 19/46
Instrumentierung
Retransformation und Redefinition
Redefinition
Auszug aus Java-Doc fur redefineClasses() (cont’d)
I The redefinition may change method bodies, the constantpool and attributes. The redefinition must not add, remove orrename fields or methods, change the signatures of methods,or change inheritance. These restrictions maybe be lifted infuture versions.
I The class file bytes are not checked, verified and installed untilafter the transformations have been applied, if the resultantbytes are in error this method will throw an exception.
,Bernd Muller 19/46
Instrumentierung
Beispiele
Beispiele
,Bernd Muller 20/46
Instrumentierung
Beispiele
Beispiel: Monitoring
Beispiel: Monitoring
,Bernd Muller 21/46
Instrumentierung
Beispiele
Beispiel: Monitoring
Beispiel Monitoring: Aufrufhaufigkeit der Methode
public class ClassToMonitor {
public void foo() {
// beliebig
}
}
I Aufrufhaufigkeit der Methode foo() soll (auf einfache Art)gezahlt werden
,Bernd Muller 22/46
Instrumentierung
Beispiele
Beispiel: Monitoring
Beispiel Monitoring: Zahler und Main
public class Monitor {
public static int counter = 0;
}
public class Main {
public static void main(String [] args)
throws Exception {
System.out.println("Zaehler vor Schleife: "
+ Monitor.counter );
ClassToMonitor classToMonitor = new ClassToMonitor ();
for (int i = 0; i < 1000; i++) {
classToMonitor.foo ();
}
System.out.println("Zaehler nach Schleife: "
+ Monitor.counter );
}
},
Bernd Muller 23/46
Instrumentierung
Beispiele
Beispiel: Monitoring
Beispiel Monitoring: Der Agent
public class MonitorAgent {
public static void premain(String agentArgs ,
Instrumentation instrumentation) {
instrumentation
.addTransformer(new MonitorTransformer ());
}
}
Und die MANIFEST.MF
Premain -Class: de.pdbm.MonitorAgent
,Bernd Muller 24/46
Beispiel Monitoring: Instrumentierung mit Javassist
public class MonitorTransformer
implements ClassFileTransformer {
public byte[] transform(ClassLoader loader , String className ,
Class <?> classBeingRedefined , ProtectionDomain protectionDomain ,
byte[] classfileBuffer) throws IllegalClassFormatException {
if (className.equals("de/pdbm/ClassToMonitor")) {
ClassPool pool = ClassPool.getDefault ();
try {
CtClass cc = pool.get("de.pdbm.ClassToMonitor");
CtMethod method = cc.getDeclaredMethod("foo");
method.insertBefore("de.pdbm.Monitor.counter ++;");
return cc.toBytecode ();
} catch (NotFoundException | CannotCompileException | IOException e) {
...
}
}
return classfileBuffer; // andere Klassen unveraendert
}
}
Instrumentierung
Beispiele
Beispiel: Klasse neu laden
Beispiel: Klasse neu laden
,Bernd Muller 26/46
Instrumentierung
Beispiele
Beispiel: Klasse neu laden
Beispiel Andern einer Methode und Neuladen
public class ClassToBeRedefined {
public void saySomething () {
System.out.println("foo");
// System.out.println ("bar ");
}
}
,Bernd Muller 27/46
Instrumentierung
Beispiele
Beispiel: Klasse neu laden
Beispiel Andern einer Methode und Neuladen (cont’d)
public class Agent {
private static Instrumentation instrumentation = null;
public static void agentmain(String agentArgument ,
Instrumentation instrumentation) {
Agent.instrumentation = instrumentation;
}
public static void redefineClasses(ClassDefinition ...
definitions) throws Exception {
if (Agent.instrumentation == null) {
throw new RuntimeException("Agent nicht gestartet. Instrumentierung nicht verfuegbar");
}
Agent.instrumentation.redefineClasses(definitions );
}
} ,Bernd Muller 28/46
Instrumentierung
Beispiele
Beispiel: Klasse neu laden
Beispiel Andern einer Methode und Neuladen (cont’d)
public class Main {
public static void main(String [] args) throws Exception {
ClassToBeRedefined ctbr = new ClassToBeRedefined ();
ctbr.saySomething ();
InputStream is = ctbr.getClass (). getClassLoader ()
// class ClassToBeRedefined
.getResourceAsStream("dummy");
byte[] classBytes = classInputStreamToByteArray(is);
ClassDefinition classDefinition =
new ClassDefinition(ctbr.getClass(), classBytes );
loadAgent ();
Agent.redefineClasses(classDefinition );
ctbr.saySomething ();
}
...
,Bernd Muller 29/46
Instrumentierung
Beispiele
Beispiel: Klasse neu laden
Beispiel Andern einer Methode und Neuladen (cont’d)
...
private static void loadAgent () {
String nameOfRunningVM = ManagementFactory
.getRuntimeMXBean (). getName ();
int p = nameOfRunningVM.indexOf(’@’);
String pid = nameOfRunningVM.substring (0, p);
try {
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent(JAR_FILE_PATH , "");
vm.detach ();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
,Bernd Muller 30/46
Instrumentierung
Beispiele
Beispiel: Klasse neu laden
Seeing is believing . . .
Demo
,Bernd Muller 31/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Beispiel: Alle Unit-Tests bestehen ;-)
,Bernd Muller 32/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Beispiel”Alle JUnit-Tests bestehen“
public class ClassToTest {
public String getTheCanonicalClassName () {
return "Falscher Name";
// return this.getClass (). getCanonicalName ();
}
public int add(int a, int b) {
return a * b;
// return a + b;
}
}
,Bernd Muller 33/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Die JUnit-Tests
public class JunitTests {
@Test
public void testClassName () {
ClassToTest ctt = new ClassToTest ();
Assert.assertEquals("Falscher Klassenname",
ClassToTest.class.getCanonicalName (),
ctt.getTheCanonicalClassName ());
}
@Test
public void testAdd () {
ClassToTest ctt = new ClassToTest ();
Assert.assertEquals("Falsche Summe", (3 + 4),
ctt.add(3, 4));
}
},
Bernd Muller 34/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Der Transformer
public class JunitTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader , String className ,
Class <?> classBeingRedefined , ProtectionDomain protectionDomain ,
byte[] classfileBuffer) throws IllegalClassFormatException {
if (className.equals("org/junit/Assert")) {
return transformAssert (); // ohne Exception -Handling
}
// alle anderen Klassen unveraendert zurueckgeben
return classfileBuffer;
}
...
}
,Bernd Muller 35/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Der Transformer
private byte[] transformAssert () throws Exception {
ClassPool pool = ClassPool.getDefault ();
CtClass cc = pool.get("org.junit.Assert");
for (CtMethod ctMethod : cc.getMethods ()) {
if (ctMethod.getName (). startsWith("assert")) {
ctMethod.setBody("return;");
} else {
// die anderen (equals(), clone(), wait(), ...)
}
}
return cc.toBytecode ();
}
,Bernd Muller 36/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Der Agent
public class TransformerAgent {
public static void agentmain(String agentArgs , Instrumentation instrumentation) {
instrumentation.addTransformer(new JunitTransformer (), true);
Class <?>[] classes = instrumentation.getAllLoadedClasses ();
for (Class <?> c : classes) {
if (c.getName (). equals("org.junit.Assert")) {
try {
instrumentation.retransformClasses(c);
} catch (UnmodifiableClassException e) {
e.printStackTrace ();
System.err.println(c + " laesst sich nicht modifizieren");
}
}
}
}
} ,Bernd Muller 37/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Und wie besteht man alle Unit-Tests?
public class ClassToTest {
static {
AgentLoader.loadAgent ();
}
public String getTheCanonicalClassName () {
return "Falscher Name";
// return this.getClass (). getCanonicalName ();
}
public int add(int a, int b) {
return a * b;
// return a + b;
}
}
,Bernd Muller 38/46
Instrumentierung
Beispiele
Beispiel: Unit-Tests
Seeing is believing . . .
Demo
,Bernd Muller 39/46
Instrumentierung
Beispiele
Beispiel: Build your own JRebel Look-Alike
Beispiel: Build your own JRebel Look-Alike
,Bernd Muller 40/46
Instrumentierung
Beispiele
Beispiel: Build your own JRebel Look-Alike
Was man dazu benotigt . . .
I File-System-Watcher! Gibt’s seit Java 7 im JDK(Interface java.nio.file.WatchService)
I Immer wenn *.class-Datei geandert wird, diese neu laden
I Das wars schon !
,Bernd Muller 41/46
Instrumentierung
Beispiele
Beispiel: Build your own JRebel Look-Alike
Was man dazu benotigt . . .
I File-System-Watcher! Gibt’s seit Java 7 im JDK(Interface java.nio.file.WatchService)
I Immer wenn *.class-Datei geandert wird, diese neu laden
I Das wars schon !
,Bernd Muller 41/46
Instrumentierung
Beispiele
Beispiel: Build your own JRebel Look-Alike
Was man dazu benotigt . . .
I File-System-Watcher! Gibt’s seit Java 7 im JDK(Interface java.nio.file.WatchService)
I Immer wenn *.class-Datei geandert wird, diese neu laden
I Das wars schon !
,Bernd Muller 41/46
Instrumentierung
Beispiele
Beispiel: Build your own JRebel Look-Alike
Seeing is believing . . .
Demo
,Bernd Muller 42/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
Beispiel: App-Server Logging
,Bernd Muller 43/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
JBoss’ Byteman (byteman.jboss.org)
I Byteman is a tool which makes it easy to trace, monitor andtest the behaviour of Java application and JDK runtime code.
I It injects Java code into your application methods or intoJava runtime methods without the need for you to recompile,repackage or even redeploy your application.
I Injection can be performed at JVM startup or after startupwhile the application is still running.
I Injected code can access any of your data and call anyapplication methods, including where they are private. Youcan inject code almost anywhere you want and there is noneed to prepare the original source code in advance.
I You can even remove injected code and reinstall differentchanges while the application continues to execute.
,Bernd Muller 44/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
JBoss’ Byteman (byteman.jboss.org)
I Byteman is a tool which makes it easy to trace, monitor andtest the behaviour of Java application and JDK runtime code.
I It injects Java code into your application methods or intoJava runtime methods without the need for you to recompile,repackage or even redeploy your application.
I Injection can be performed at JVM startup or after startupwhile the application is still running.
I Injected code can access any of your data and call anyapplication methods, including where they are private. Youcan inject code almost anywhere you want and there is noneed to prepare the original source code in advance.
I You can even remove injected code and reinstall differentchanges while the application continues to execute.
,Bernd Muller 44/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
JBoss’ Byteman (byteman.jboss.org)
I Byteman is a tool which makes it easy to trace, monitor andtest the behaviour of Java application and JDK runtime code.
I It injects Java code into your application methods or intoJava runtime methods without the need for you to recompile,repackage or even redeploy your application.
I Injection can be performed at JVM startup or after startupwhile the application is still running.
I Injected code can access any of your data and call anyapplication methods, including where they are private. Youcan inject code almost anywhere you want and there is noneed to prepare the original source code in advance.
I You can even remove injected code and reinstall differentchanges while the application continues to execute.
,Bernd Muller 44/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
JBoss’ Byteman (byteman.jboss.org)
I Byteman is a tool which makes it easy to trace, monitor andtest the behaviour of Java application and JDK runtime code.
I It injects Java code into your application methods or intoJava runtime methods without the need for you to recompile,repackage or even redeploy your application.
I Injection can be performed at JVM startup or after startupwhile the application is still running.
I Injected code can access any of your data and call anyapplication methods, including where they are private. Youcan inject code almost anywhere you want and there is noneed to prepare the original source code in advance.
I You can even remove injected code and reinstall differentchanges while the application continues to execute.
,Bernd Muller 44/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
JBoss’ Byteman (byteman.jboss.org)
I Byteman is a tool which makes it easy to trace, monitor andtest the behaviour of Java application and JDK runtime code.
I It injects Java code into your application methods or intoJava runtime methods without the need for you to recompile,repackage or even redeploy your application.
I Injection can be performed at JVM startup or after startupwhile the application is still running.
I Injected code can access any of your data and call anyapplication methods, including where they are private. Youcan inject code almost anywhere you want and there is noneed to prepare the original source code in advance.
I You can even remove injected code and reinstall differentchanges while the application continues to execute.
,Bernd Muller 44/46
Instrumentierung
Beispiele
Beispiel: App-Server Logging
Seeing is believing . . .
Demo
,Bernd Muller 45/46
Instrumentierung
Fragen und Anmerkungen
Fragen und Anmerkungen
,Bernd Muller 46/46