81
Instrumentierung Instrumentierung — Das Werkzeug der Werkzeugmacher — Bernd M¨ uller Ostfalia Hochschule Braunschweig/Wolfenb¨ uttel Bernd M¨ uller 1/46

Instrumentierung - Das Werkzeug der Werkzeugmacher -

Embed Size (px)

Citation preview

Page 1: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Instrumentierung— Das Werkzeug der Werkzeugmacher —

Bernd Muller

OstfaliaHochschule Braunschweig/Wolfenbuttel

,Bernd Muller 1/46

Page 2: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Agenda

I Instrumentierung und Agenten

I Redefinition und Retransformation

I Beispiele

,Bernd Muller 2/46

Page 3: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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 [email protected]

I @berndmuller

,Bernd Muller 3/46

Page 4: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Instrumentierung und Agenten

Instrumentierung und Agenten

oder

Alt, machtig, aber unbekannt . . .

,Bernd Muller 4/46

Page 5: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 6: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 7: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 8: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 9: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 10: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 11: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 12: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 13: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 14: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 15: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Instrumentierung und Agenten

Pre-Main

Pre-Main

oder

Gibt es ein Leben vor main() ?

,Bernd Muller 7/46

Page 16: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 17: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 18: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 19: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 20: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 21: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 22: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 23: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 24: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 25: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 26: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 27: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 28: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Instrumentierung und Agenten

Attach-API

Das Attach-API

oder

Wie rede ich mit einer VM ?

,Bernd Muller 10/46

Page 29: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 30: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 31: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 32: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 33: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 34: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Retransformation und Redefinition

Retransformation und Redefinition

oder

Andern oder neu machen ?

,Bernd Muller 14/46

Page 35: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 36: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 37: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 38: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 39: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 40: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 41: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 42: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 43: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 44: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 45: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 46: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 47: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 48: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 49: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiele

,Bernd Muller 20/46

Page 50: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Monitoring

Beispiel: Monitoring

,Bernd Muller 21/46

Page 51: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 52: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 53: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 54: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

}

}

Page 55: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Klasse neu laden

Beispiel: Klasse neu laden

,Bernd Muller 26/46

Page 56: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 57: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 58: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 59: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 60: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Klasse neu laden

Seeing is believing . . .

Demo

,Bernd Muller 31/46

Page 61: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Unit-Tests

Beispiel: Alle Unit-Tests bestehen ;-)

,Bernd Muller 32/46

Page 62: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 63: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 64: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 65: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 66: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 67: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 68: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Unit-Tests

Seeing is believing . . .

Demo

,Bernd Muller 39/46

Page 69: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Build your own JRebel Look-Alike

Beispiel: Build your own JRebel Look-Alike

,Bernd Muller 40/46

Page 70: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 71: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 72: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 73: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: Build your own JRebel Look-Alike

Seeing is believing . . .

Demo

,Bernd Muller 42/46

Page 74: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: App-Server Logging

Beispiel: App-Server Logging

,Bernd Muller 43/46

Page 75: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 76: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 77: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 78: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 79: Instrumentierung - Das Werkzeug der Werkzeugmacher -

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

Page 80: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Beispiele

Beispiel: App-Server Logging

Seeing is believing . . .

Demo

,Bernd Muller 45/46

Page 81: Instrumentierung - Das Werkzeug der Werkzeugmacher -

Instrumentierung

Fragen und Anmerkungen

Fragen und Anmerkungen

,Bernd Muller 46/46