#!/bin/sh # # Copyright 2001-2003 BBNT Solutions, LLC # under sponsorship of the Defense Advanced Research Projects Agency (DARPA). # # This program is free software; you can redistribute it and/or modify # it under the terms of the Cougaar Open Source License as published by # DARPA on the Cougaar Open Source Website (www.cougaar.org). # # THE COUGAAR SOFTWARE AND ANY DERIVATIVE SUPPLIED BY LICENSOR IS # PROVIDED 'AS IS' WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS OR # IMPLIED, INCLUDING (BUT NOT LIMITED TO) ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND WITHOUT # ANY WARRANTIES AS TO NON-INFRINGEMENT. IN NO EVENT SHALL COPYRIGHT # HOLDER BE LIABLE FOR ANY DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE OF DATA OR PROFITS, # TORTIOUS CONDUCT, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THE COUGAAR SOFTWARE. # # # transform jar to add "memory tracker" profiling code # # run with "--help" for usage notes. # usage () { cat < ... EOF exit 1 fi # parse file RET=`perl -ne\ 'print join(" ", split(/,/, $1)) if (/^\s*'${2}'\s*=\s*(.*)$/);'\ $DEPENDENCY_FILE` eval "$1=\"$RET\"" } get_classpath () { # optionally just use the bootstrapper! if [ ! -z $BOOTSTRAP ]; then eval "$1=\"\"" fi # get jar dependencies from "default.build" get_dependency SEPLIB "${MODULE}\.deps" get_dependency SEPSYS "${MODULE}\.jars" if [ -z "$SEPLIB" ] && [ -z "$SEPSYS" ]; then echo " zero dependencies: $DEPENDENCY_FILE" fi LIBDEP="" for x in $SEPLIB; do if [ -f $CIP/lib/$x.jar ]; then if [ -z $LIBDEP ]; then LIBDEP="$CIP/lib/$x.jar" else LIBDEP="$LIBDEP;$CIP/lib/$x.jar" fi else echo " missing dependency: $CIP/lib/$x.jar" fi done SYSDEP="" if [ -f $CIP/lib/javaiopatch.jar ]; then SYSDEP=$CIP/lib/javaiopatch.jar fi for x in $SEPSYS; do if [ -f $CIP/sys/$x.jar ]; then if [ -z $SYSDEP ]; then SYSDEP="$CIP/sys/$x.jar" else SYSDEP="$SYSDEP;$CIP/sys/$x.jar" fi else echo " missing dependency: $CIP/sys/$x.jar" fi done RET="$DIR/$MODULE.jar" if [ ! -z $LIBDEP ]; then RET="$RET;$LIBDEP" fi if [ ! -z $SYSDEP ]; then RET="$RET;$SYSDEP" fi eval "$1=\"$RET\"" } TMP_RET="" get_transform_command () { LIB=$2 if [ -z $BOOTSTRAP ]; then CP="$BCEL;$CIP/lib/profiler_transform.jar;$CIP/lib/profiler_impl.jar" if [ ! -z $LIB ]; then CP="$CP;$LIB" fi BOOTCL= else CP=$CIP/lib/bootstrap.jar if [ ! -e $CP ]; then echo "bootstrap jar not found: $CP" exit 1 fi BOOTCL="org.cougaar.bootstrap.Bootstrapper" fi # basic command excluding classname and args RET="java -classpath $CP $BOOTCL" TMP_RET=$RET # eval "$1=\"$RET\"" } transform_one () { LIB=$1 FILE=$2 echo " instrumenting $FILE" get_transform_command COMMAND $LIB COMMAND="$TMP_RET" cd $TMP/$MODULE || exit 1 OLD=old/classes/$FILE NEW=new/old/classes/$FILE if [ ! -f $OLD ]; then echo " file not found: $OLD" exit 1 fi COMMAND="$COMMAND \ org.cougaar.profiler.transform.SelfProfiler \ $OPTIONS \ $OLD" if [ ! -z $VERBOSE ]; then echo "$COMMAND to $NEW" fi $COMMAND > $NEW || exit 1 if [ ! -f $NEW ]; then echo "Transform $FILE failed, missing $NEW" exit 1 fi } transform () { LIB=$1 echo " instrumenting" get_transform_command COMMAND $LIB COMMAND="$TMP_RET" cd $TMP/$MODULE || exit 1 COMMAND="$COMMAND \ org.cougaar.profiler.transform.ProfileAll \ old \ $OPTIONS" if [ ! -z $VERBOSE ]; then echo $COMMAND fi $COMMAND || exit 1 if [ ! -d new/old/classes ]; then echo "Transform $MODULE failed, missing $TMP/new/old/classes" exit 1 fi } transform_jdk () { NAME=$1 ORIG_FILTERS="$FILTERS" if [ "$FILTERS" = "" ]; then FILTERS="java/${NAME}/*" fi restore_jars prepare_jdk $NAME transform "" create_jars } transform_cougaar () { restore_jars prepare_cougaar get_classpath LIB transform $LIB create_jars } # parse "[/foo/]${MODULE}[.jar]" BASE=`echo $MODULE | perl -ne 'print $2 if (/^(.*\/)?([^\/]*)(\.jar)(\.(old|new))*$/)'` if [ ! -z $BASE ]; then MODULE=$BASE fi if [ $MODULE = profiler_config ] || [ $MODULE = profiler_impl ] || [ $MODULE = profiler_transform ] || [ $MODULE = bootstrap ] || [ $MODULE = bcel ]; then echo "skipping $MODULE" exit 0 fi if [ $MODULE = javaiopatch ]; then # compatibility for Cougaar IO patch $MODULE="java.io" fi # parse "java.${NAME}" NAME=`echo $MODULE | perl -ne 'print $1 if (/^java\.(.*)$/)'` if [ ! -z $NAME ]; then MODULE="java${NAME}patch" fi # specify module in profiled class OPTIONS="--module=$MODULE $OPTIONS" get_dir DIR $NAME if [ -z $FORCE ] && [ -e $DIR/$MODULE.jar.new ]; then echo "already transformed $MODULE" echo " linking $MODULE.jar.new -> $MODULE.jar" echo " to force transform, run: $0 -f $MODULE" link_jars exit 0 fi echo "transforming $MODULE" if [ -z $NAME ]; then transform_cougaar else transform_jdk $NAME fi