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

Both sides previous revision Previous revision
Next revision
Previous revision
using-jp2-to-instrument-programs-based-on-apache-felix [2011/03/02 05:19]
weiwu
using-jp2-to-instrument-programs-based-on-apache-felix [2019/10/06 20:37] (current)
Line 1: Line 1:
-JP2 is 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 executed bytecode ​number ​to estimate the CPU consumption of a Java program. +====== Background ====== 
-To do that, we need to modify the command executing the Java program like this:+ 
 +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>​ <​code>​
Line 14: Line 15:
  
  
 +====== Felix and SIP ======
  
-Felix is an Apache implementation of the OSGi specifications which define ​a dynamic service deployment framework ((http://felix.apache.org/site/​index.html)). The basic idea of OSGi is providing ​a framework on which the service implementations or bundles are plugged. The framework handles ​the service ​requests and responses. Each bundle communicates only with the framework. SIP communications is a Java VoIP and instant messaging ​client ​using Felix.+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 specificationswhich 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, ​requestsand 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 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>​ 
 + 
 + 
 + 
 +==== Telling Felix where to find JP2 for the Instrumented Bundles ==== 
 + 
 +Add 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 the JP2 bundle to felix.client.run.properties:​ 
 +<​code>​ 
 +felix.auto.start.11= \ 
 + ​reference:​file:​lib/​bundle/​bundle-jp2.jar 
 +</​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. 
 + 
 +  * Set org.osgi.framework.bootdelegation to JP2 classes in the execute script. The original JP2 jars in -XBootclasspath are still needed by -javaagent. 
 +<​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>​
  
-While using JP2 to count the executed bytecode number of SIP communicator, we met +Run this script ​to execute ​the instrumented ​SIP communicator.
  
using-jp2-to-instrument-programs-based-on-apache-felix.1299043178.txt.gz · Last modified: 2019/10/06 20:37 (external edit)