Instrumentierung - Das Werkzeug der Werkzeugmacher -

Preview:

Citation preview

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 bernd.mueller@ostfalia.de

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

Recommended