instrumentierung das werkzeug der werkzeugmacher · instrumentierung instrumentierung und agenten...

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

Upload: others

Post on 10-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Instrumentierung— Das Werkzeug der Werkzeugmacher —

Bernd Muller

OstfaliaHochschule Braunschweig/Wolfenbuttel

,Bernd Muller 1/45

Page 2: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Agenda

I Instrumentierung und Agenten

I Redefinition und Retransformation

I Beispiele

,Bernd Muller 2/45

Page 3: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 GmbHI . . .I [email protected] @berndmuller

,Bernd Muller 3/45

Page 4: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Instrumentierung und Agenten

Instrumentierung und Agenten

oder

Alt, machtig, aber unbekannt . . .

,Bernd Muller 4/45

Page 5: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Instrumentierung und Agenten

Instrumentierung in Java 5

Das Package java.lang.instrument

I Das Package java.lang.instrument wurde mit Java 5 eingefuhrt

I Java-Doc:

”. . . Provides services that allow Java programming language agents to instrument

programs running on the JVM. The mechanism for instrumentation ismodification of the byte-codes of methods. . . .“

I Verwendungsmoglichkeiten: Monitoring, JPA-Provider, Code-Coverage, . . .

I Allgemein: Sinnvolles Verhalten, das nicht im Code steht, nachtraglich und nur beiBedarf einbauen

,Bernd Muller 5/45

Page 6: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 undimplementation dependent)

I Artikel Java Magazin 3/2015: James Bond lasst grußen - Geheimagenten (odergeheime Agenten) bei ihrer Arbeit

,Bernd Muller 6/45

Page 7: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Instrumentierung und Agenten

Pre-Main

Pre-Main

oder

Gibt es ein Leben vor main() ?

,Bernd Muller 7/45

Page 8: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 Optionen aufgerufen, dann die main()-MethodeI 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 existiertI Agent wird uber System-Class-Loader geladen

,Bernd Muller 8/45

Page 9: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Instrumentierung und Agenten

Attach-API

Das Attach-API

oder

Wie rede ich mit einer VM ?

,Bernd Muller 9/45

Page 10: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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, an implementation may provide a mechanism thatallows a tool to attach to a running application, and initiate the loading of the tool’sagent into the running application. The details as to how the load is initiated, isimplementation dependent.“

I Achtung: implementierungsabhangig

I Aber: in HotSpot, JRockit, IBM, SAP vorhanden

I Schnittstelle ist die abstrakte Klasse VirtualMachine im Packagecom.sun.tools.attach, enthalten in tools.jar

,Bernd Muller 10/45

Page 11: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 to which it is attached is sometimescalled the target virtual machine, or target VM. An application (typically a tool such asa managemet console or profiler) uses a VirtualMachine to load an agent into thetarget 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 11/45

Page 12: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 des Agenten setzten

,Bernd Muller 12/45

Page 13: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Retransformation und Redefinition

Retransformation und Redefinition

oder

Andern oder neu machen ?

,Bernd Muller 13/45

Page 14: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Retransformation und Redefinition

Retransformation und Redefinition

I Moglichkeit, bereits geladene Klassen ganz oder teilweise zu ersetzen

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 class without reference to the existing class filebytes, as one might do 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 14/45

Page 15: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Retransformation und Redefinition

Retransformation

Retransformation

I Attribut Can-Retransform-Classes im Manifest auf true setzen

I Transformer registrieren:Instrumentation.addTransformer(ClassFileTransformer transformer)

I Entsprechende Methode aufrufen:Instrumentation.retransformClasses(Class<?>... classes)

,Bernd Muller 15/45

Page 16: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Retransformation und Redefinition

Redefinition

Redefinition

I Attribut Can-Redefine-Classes im Manifest auf true setzen

I Entsprechende Methode aufrufen:Instrumentation.redefineClasses(Class<?>... classes)

,Bernd Muller 16/45

Page 17: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Retransformation und Redefinition

Redefinition

Auszug aus Java-Doc fur redefineClasses()

I If a redefined method has active stack frames, those active frames continue to runthe bytecodes of the original method. The redefined method will be used on newinvokes.

I This method does not cause any initialization except that which would occurunder the customary JVM semantics. In other words, redefining a class does notcause its initializers to be run. The values of static variables will remain as theywere prior to the call.

I Instances of the redefined class are not affected.

,Bernd Muller 17/45

Page 18: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Retransformation und Redefinition

Redefinition

Auszug aus Java-Doc fur redefineClasses() (cont’d)

I The redefinition may change method bodies, the constant pool and attributes.The redefinition must not add, remove or rename fields or methods, change thesignatures of methods, or change inheritance. These restrictions maybe be lifted infuture versions.

I The class file bytes are not checked, verified and installed until after thetransformations have been applied, if the resultant bytes are in error this methodwill throw an exception.

,Bernd Muller 18/45

Page 19: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiele

,Bernd Muller 19/45

Page 20: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Monitoring

Beispiel: Monitoring

,Bernd Muller 20/45

Page 21: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 21/45

Page 22: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 22/45

Page 23: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 23/45

Page 24: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 25: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Klasse neu laden

Beispiel: Klasse neu laden

,Bernd Muller 25/45

Page 26: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 26/45

Page 27: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 27/45

Page 28: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 28/45

Page 29: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 29/45

Page 30: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Klasse neu laden

Seeing is believing . . .

Demo

,Bernd Muller 30/45

Page 31: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Unit-Tests

Beispiel: Alle Unit-Tests bestehen ;-)

,Bernd Muller 31/45

Page 32: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 32/45

Page 33: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 33/45

Page 34: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 34/45

Page 35: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 35/45

Page 36: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 36/45

Page 37: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 37/45

Page 38: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Unit-Tests

Seeing is believing . . .

Demo

,Bernd Muller 38/45

Page 39: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Build your own JRebel Look-Alike

Beispiel: Build your own JRebel Look-Alike

,Bernd Muller 39/45

Page 40: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

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 40/45

Page 41: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: Build your own JRebel Look-Alike

Seeing is believing . . .

Demo

,Bernd Muller 41/45

Page 42: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: App-Server Logging

Beispiel: App-Server Logging

,Bernd Muller 42/45

Page 43: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: App-Server Logging

JBoss’ Byteman (byteman.jboss.org)

I Byteman is a tool which makes it easy to trace, monitor and test the behaviour ofJava application and JDK runtime code.

I It injects Java code into your application methods or into Java runtime methodswithout the need for you to recompile, repackage or even redeploy yourapplication.

I Injection can be performed at JVM startup or after startup while the application isstill running.

I Injected code can access any of your data and call any application methods,including where they are private. You can inject code almost anywhere you wantand there is no need to prepare the original source code in advance.

I You can even remove injected code and reinstall different changes while theapplication continues to execute.

,Bernd Muller 43/45

Page 44: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Beispiele

Beispiel: App-Server Logging

Seeing is believing . . .

Demo

,Bernd Muller 44/45

Page 45: Instrumentierung Das Werkzeug der Werkzeugmacher · Instrumentierung Instrumentierung und Agenten Pre-Main Agentenstart uber Kommandozeile I Syntax: -javaagent:jarpath[=options] I

Instrumentierung

Fragen und Anmerkungen

Fragen und Anmerkungen

,Bernd Muller 45/45