User Tools

Site Tools


using-jp2-to-instrument-programs-based-on-apache-felix

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

using-jp2-to-instrument-programs-based-on-apache-felix [2011/03/05 17:08]
yann
using-jp2-to-instrument-programs-based-on-apache-felix [2018/03/04 02:53]
Line 1: Line 1:
-====== Background ====== 
- 
-JP2 is an excellent and easy-to-use Java Profiler developed by Binder et al.((W. Binder and J. Hulaas, "Using bytecode instruction counting as portable cpu consumption metric",​ Electronic Notes In Theoretical Computer Science, vol. 153, pp. 57-77, May 2006.)). It can be used to count the numbers of executed bytecode instructions to estimate the CPU consumption of a Java program. The basics of calling JP2 are as follows: 
- 
-<​code>​ 
-java -Xmx2g \ 
-    -javaagent:​$JP2_HOME/​lib/​javaagent.jar \ 
-    -Xbootclasspath/​p:​$JP2_HOME/​lib/​Thread_JP2.jar:​$JP2_HOME/​lib/​asm-all-3.3.jar:​$JP2_HOME/​lib/​jp2.jar \ 
-    -Dch.usi.dag.jp2.Output="​program.output.gz"​ \ 
-    -Dch.usi.dag.jp2.InstrumentedClasses="​ProgramInstrumented"​ \ 
-    -Dch.usi.dag.jp2.UninstrumentedClasses="​ProgramUninstrumented"​ \ 
-    -cp YourClasspath YourMainClass ​ 
-</​code>​ 
- 
- 
- 
-====== 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. ​ 
- 
-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. 
- 
- 
- 
-==== 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>​. 
- 
- 
- 
-==== Instrumenting the Bundles in Felix ==== 
- 
-  * Add a bundle which contains all the classes of JP2 into the build.xml of SIP: 
-<​code>​ 
- <target name="​bundle-jp2">​ 
- <jar compress="​true"​ destfile="​${bundles.dest}/​bundle-jp2.jar"​ filesetmanifest="​skip">​ 
- <​zipfileset src="​${lib.noinst}/​jp2/​asm-all-3.3.jar"​ prefix=""​ /> 
- <​zipfileset src="​${lib.noinst}/​jp2/​bcel-5.2.jar"​ prefix=""​ /> 
- <​zipfileset src="​${lib.noinst}/​jp2/​javaagent.jar"​ prefix=""​ /> 
- <​zipfileset src="​${lib.noinst}/​jp2/​jp2.jar"​ prefix=""​ /> 
- <​zipfileset src="​${lib.noinst}/​jp2/​jre-tool.jar"​ prefix=""​ /> 
- <​zipfileset src="​${lib.noinst}/​jp2/​Thread_JP2.jar"​ prefix=""​ /> 
- <​zipfileset src="​${lib.noinst}/​jp2/​thread-tool.jar"​ prefix=""​ /> 
- <​manifest>​ 
- <​attribute name="​Export-Package"​ value="​ch.usi.dag.jp2.agent,​ch.usi.dag.jp2.rewriting,​ch.usi.dag.jp2.runtime,​ch.usi.dag.jp2.tools.jre,​ch.usi.dag.jp2.tools.thread"​ /> 
- <​attribute name="​Bundle-Name"​ value="​JP2"​ /> 
- <​attribute name="​Bundle-Description"​ value="​Java Instrument Library."​ /> 
- <​attribute name="​Bundle-Version"​ value="​1.0"​ /> 
- <​attribute name="​System-Bundle"​ value="​yes"​ /> 
- </​manifest>​ 
- </​jar>​ 
- </​target>​ 
-</​code>​ 
- 
-  * Add JP2 bundle to felix.client.run.properties:​ 
-<​code>​ 
-felix.auto.start.11= \ 
- ​reference:​file:​lib/​bundle/​bundle-jp2.jar 
-</​code>​ 
- 
-  * 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: 
-<​code>​ 
-javabin=`which java` 
- 
-SCDIR=$WORKING-DIR 
-LIBPATH=$SCDIR/​lib 
-BUNDLEPATH=$SCDIR/​sc-bundles 
-CLASSPATH=$LIBPATH/​jdic_stub.jar:​$LIBPATH/​jdic-all.jar:​$LIBPATH/​felix.jar:​$LIBPATH/​bcprovider.jar:​$SCDIR/​sc-bundles/​sc-launcher.jar:​$SCDIR/​sc-bundles/​util.jar 
-FELIX_CONFIG=$LIBPATH/​felix.client.run.properties 
-LOG_CONFIG=$LIBPATH/​logging.properties 
-COMMAND="​$javabin -Xmx2g \ 
-    -javaagent:​$LIBPATH/​javaagent.jar \ 
-    -Xbootclasspath/​p:​$LIBPATH/​Thread_JP2.jar:​$LIBPATH/​asm-all-3.3.jar:​$LIBPATH/​jp2.jar \ 
-    -Dch.usi.dag.jp2.Output="​sip.output.gz"​ \ 
-    -Dch.usi.dag.jp2.InstrumentedClasses="​sipInstrumented"​ \ 
-    -Dch.usi.dag.jp2.UninstrumentedClasses="​sipUninstrumented"​ \ 
-    -Dch.usi.dag.jp2.InsterestedPackage="​net.java.sip"​ -classpath $CLASSPATH -Dorg.osgi.framework.bootdelegation=ch.usi.* \ 
-    -Djna.library.path=$LIBPATH/​native -Dfelix.config.properties=file:​$FELIX_CONFIG -Djava.util.logging.config.file=$LOG_CONFIG \    
-    net.java.sip.communicator.launcher.SIPCommunicator"​ 
- 
-# set add LIBPATH to LD_LIBRARY_PATH for any sc natives (e.g. jmf .so's) 
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:​$LIBPATH/​native 
- 
-# make LD_PRELOAD use libaoss so that java doesn'​t hog on the audio device. 
-export LD_PRELOAD=/​usr/​lib/​libaoss.so 
- 
-# create .sip-commnicator/​log in home or otherwise java.util.logging will freak 
-mkdir -p $HOME/​.sip-communicator/​log 
- 
-cd $SCDIR 
- 
-exec $COMMAND $* 
-</​code>​ 
- 
-Run this script to execute the instrumented SIP communicator. 
  
using-jp2-to-instrument-programs-based-on-apache-felix.txt ยท Last modified: 2019/10/06 20:37 (external edit)