This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
using-jp2-to-instrument-programs-based-on-apache-felix [2011/03/05 17:07] yann |
using-jp2-to-instrument-programs-based-on-apache-felix [2019/10/06 20:37] (current) |
||
---|---|---|---|
Line 17: | Line 17: | ||
====== Felix and SIP ====== | ====== Felix and SIP ====== | ||
- | While the previous code works well and allows instrumenting programs in most situations, we faced some difficulties when instrumenting SIP communications((http://sip-communicator.org/)). SIP Communicator is a Java VoIP and instant messaging client using Felix. Felix((http://felix.apache.org/site/index.html)) is the Apache implementation of the OSGi specifications, which defines a dynamic service deployment framework. The OSGi specifications((http://www.osgi.org/)) defines a framework on which service implementations or *bundles* are plugged and managed by the framework, independently of the underlying running JVM (and its classpath). The framework handles bundle discovery, dependencies, requests, and responses. Each bundle communicates only with/through the framework. | + | While the previous code works well and allows instrumenting programs in most situations, we faced some difficulties when instrumenting SIP communications((http://sip-communicator.org/)). SIP Communicator is a Java VoIP and instant messaging client using Felix. Felix((http://felix.apache.org/site/index.html)) is the Apache implementation of the OSGi specifications, which defines a dynamic service deployment framework. The OSGi specifications((http://www.osgi.org/)) defines a framework on which service implementations or //bundles// are plugged and managed by the framework, independently of the underlying running JVM (and its classpath). The framework handles bundle discovery, dependencies, requests, and responses. Each bundle communicates only with/through the framework. |
We wanted to count the numbers of executed bytecode instructions of SIP communicator using JP2. When instrumenting SIP Communicator, we ran into several problems, which we fixed as follows. | We wanted to count the numbers of executed bytecode instructions of SIP communicator using JP2. When instrumenting SIP Communicator, we ran into several problems, which we fixed as follows. | ||
Line 25: | Line 25: | ||
==== Not Instrumenting Felix ==== | ==== Not Instrumenting Felix ==== | ||
- | * Exclude Felix classes from instrumenting, so they can be executed without know JP2. We need to add <code>!className.startsWith("org/apache/felix")</code> to method <code>byte[] transform(ClassLoader loader, String className, Class<?> redefiningClass, ProtectionDomain domain, byte[] uninstrumentedBytes)</code> in <code> ch.usi.dag.jp2.agent.SimpleTransformer </code>. | + | Exclude Felix classes from being instrumented, so Felix can run without having to know about JP2. We added: |
+ | <code>!className.startsWith("org/apache/felix")</code> | ||
+ | to method: | ||
+ | <code>byte[] transform(ClassLoader loader, String className, Class<?> redefiningClass, ProtectionDomain domain, byte[] uninstrumentedBytes)</code> | ||
+ | in class: | ||
+ | <code> ch.usi.dag.jp2.agent.SimpleTransformer </code> | ||
- | ==== Instrumenting the Bundles in Felix ==== | + | ==== Telling Felix where to find JP2 for the Instrumented Bundles ==== |
- | * Add a bundle which contains all the classes of JP2 into the build.xml of SIP: | + | Add a bundle which contains all the classes of JP2 into the build.xml of SIP: |
<code> | <code> | ||
<target name="bundle-jp2"> | <target name="bundle-jp2"> | ||
Line 53: | Line 58: | ||
</code> | </code> | ||
- | * Add JP2 bundle to felix.client.run.properties: | + | Add the JP2 bundle to felix.client.run.properties: |
<code> | <code> | ||
felix.auto.start.11= \ | felix.auto.start.11= \ | ||
reference:file:lib/bundle/bundle-jp2.jar | reference:file:lib/bundle/bundle-jp2.jar | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ==== Telling SIP Communicator Bundles about JP2 ==== | ||
* Add all the packages of JP2 to the Import-Package attribute of the MANIFEST.MF of all other bundles. | * Add all the packages of JP2 to the Import-Package attribute of the MANIFEST.MF of all other bundles. | ||
- | * Set org.osgi.framework.bootdelegation to JP2 classes in the execute script: | + | * Set org.osgi.framework.bootdelegation to JP2 classes in the execute script. The original JP2 jars in -XBootclasspath are still needed by -javaagent. |
<code> | <code> | ||
javabin=`which java` | javabin=`which java` |