1 #!/bin/sh
   2 
   3 # Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
   4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 #
   6 # This code is free software; you can redistribute it and/or modify it
   7 # under the terms of the GNU General Public License version 2 only, as
   8 # published by the Free Software Foundation.
   9 #
  10 # This code is distributed in the hope that it will be useful, but WITHOUT
  11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13 # version 2 for more details (a copy is included in the LICENSE file that
  14 # accompanied this code).
  15 #
  16 # You should have received a copy of the GNU General Public License version
  17 # 2 along with this work; if not, write to the Free Software Foundation,
  18 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19 #
  20 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21 # or visit www.oracle.com if you need additional information or have any
  22 # questions.
  23 
  24 
  25 # This script launches HotSpot.
  26 #
  27 # If the first parameter is either "-gdb" or "-gud", HotSpot will be
  28 # launched inside gdb. "-gud" means "open an Emacs window and run gdb
  29 # inside Emacs".
  30 #
  31 # If the first parameter is "-dbx", HotSpot will be launched inside dbx.
  32 #
  33 # If the first parameter is "-valgrind", HotSpot will be launched
  34 # inside Valgrind (http://valgrind.kde.org) using the Memcheck skin,
  35 # and with memory leak detection enabled.  This currently (2005jan19)
  36 # requires at least Valgrind 2.3.0.  -Xmx16m will also be passed as
  37 # the first parameter to HotSpot, since lowering HotSpot's memory
  38 # consumption makes execution inside of Valgrind *a lot* faster.
  39 #
  40 
  41 
  42 #
  43 # User changeable parameters ------------------------------------------------
  44 #
  45 
  46 # This is the name of the gdb binary to use
  47 if [ ! "$GDB" ]
  48 then
  49     GDB=gdb
  50 fi
  51 
  52 # This is the name of the dbx binary to use
  53 if [ ! "$DBX" ]
  54 then
  55     DBX=dbx
  56 fi
  57 
  58 # This is the name of the Valgrind binary to use
  59 if [ ! "$VALGRIND" ]
  60 then
  61     VALGRIND=valgrind
  62 fi
  63 
  64 # This is the name of Emacs for running GUD
  65 EMACS=emacs
  66 
  67 #
  68 # End of user changeable parameters -----------------------------------------
  69 #
  70 
  71 OS=`uname -s`
  72 
  73 # Make sure the paths are fully specified, i.e. they must begin with /.
  74 REL_MYDIR=`dirname $0`
  75 MYDIR=`cd $REL_MYDIR && pwd`
  76 case "$OS" in
  77 CYGWIN*)
  78     MYDIR=`cygpath -m "$MYDIR"`
  79     ;;
  80 esac
  81 
  82 #
  83 # Look whether the user wants to run inside gdb
  84 case "$1" in
  85     -gdb)
  86         MODE=gdb
  87         shift
  88         ;;
  89     -gud)
  90         MODE=gud
  91         shift
  92         ;;
  93     -dbx)
  94         MODE=dbx
  95         shift
  96         ;;
  97     -valgrind)
  98         MODE=valgrind
  99         shift
 100         ;;
 101     *)
 102         MODE=run
 103         ;;
 104 esac
 105 
 106 if [ "${ALT_JAVA_HOME}" != "" ]; then
 107     JDK=${ALT_JAVA_HOME%%/jre}
 108 else
 109     JDK=@@JDK_IMPORT_PATH@@
 110 fi
 111 
 112 if [ "${JDK}" != "" ]; then
 113     case "$OS" in
 114     CYGWIN*)
 115         JDK=`cygpath -m "$JDK"`
 116         ;;
 117         esac
 118 
 119 else
 120     echo "Failed to find JDK." \
 121         "Either ALT_JAVA_HOME is not set or JDK_IMPORT_PATH is empty."
 122     exit 1
 123 fi
 124 
 125 # We will set the LD_LIBRARY_PATH as follows:
 126 #     o         $JVMPATH (directory portion only)
 127 #     o         $JRE/lib/$ARCH
 128 # followed by the user's previous effective LD_LIBRARY_PATH, if
 129 # any.
 130 JRE=$JDK/jre
 131 JAVA_HOME=$JDK
 132 export JAVA_HOME
 133 
 134 ARCH=@@LIBARCH@@
 135 SBP=${MYDIR}:${JRE}/lib/${ARCH}
 136 
 137 
 138 # Set up a suitable LD_LIBRARY_PATH or DYLD_LIBRARY_PATH
 139 if [ "${OS}" = "Darwin" ]
 140 then
 141     if [ -z "$DYLD_LIBRARY_PATH" ]
 142     then
 143         DYLD_LIBRARY_PATH="$SBP"
 144     else
 145         DYLD_LIBRARY_PATH="$SBP:$DYLD_LIBRARY_PATH"
 146     fi
 147     export DYLD_LIBRARY_PATH
 148 else
 149     # not 'Darwin'
 150     if [ -z "$LD_LIBRARY_PATH" ]
 151     then
 152         LD_LIBRARY_PATH="$SBP"
 153     else
 154         LD_LIBRARY_PATH="$SBP:$LD_LIBRARY_PATH"
 155     fi
 156     export LD_LIBRARY_PATH
 157 fi
 158 
 159 JPARMS="-XXaltjvm=$MYDIR -Dsun.java.launcher.is_altjvm=true $@ $JAVA_ARGS";
 160 
 161 # Locate the java launcher
 162 LAUNCHER=$JDK/bin/java
 163 if [ ! -x $LAUNCHER ] ; then
 164     echo Error: Cannot find the java launcher \"$LAUNCHER\"
 165     exit 1
 166 fi
 167 
 168 GDBSRCDIR=$MYDIR
 169 BASEDIR=`cd $MYDIR/../../.. && pwd`
 170 case "$OS" in
 171 CYGWIN*)
 172     BASEDIR=`cygpath -m "$BASEDIR"`
 173     ;;
 174 esac
 175 
 176 init_gdb() {
 177 # Create a gdb script in case we should run inside gdb
 178     GDBSCR=/tmp/hsl.$$
 179     rm -f $GDBSCR
 180     cat >>$GDBSCR <<EOF
 181 cd `pwd`
 182 handle SIGUSR1 nostop noprint
 183 handle SIGUSR2 nostop noprint
 184 set args $JPARMS
 185 file $LAUNCHER
 186 directory $GDBSRCDIR
 187 # Get us to a point where we can set breakpoints in libjvm.so
 188 set breakpoint pending on
 189 break JNI_CreateJavaVM
 190 run
 191 # Stop in JNI_CreateJavaVM
 192 delete 1
 193 # We can now set breakpoints wherever we like
 194 EOF
 195 }
 196 
 197 
 198 case "$MODE" in
 199     gdb)
 200         init_gdb
 201         $GDB -x $GDBSCR
 202         rm -f $GDBSCR
 203         ;;
 204     gud)
 205         init_gdb
 206 # First find out what emacs version we're using, so that we can
 207 # use the new pretty GDB mode if emacs -version >= 22.1
 208         case `$EMACS -version 2> /dev/null` in
 209             *GNU\ Emacs\ 2[23]*)
 210             emacs_gud_cmd="gdba"
 211             emacs_gud_args="--annotate=3"
 212             ;;
 213             *)
 214                 emacs_gud_cmd="gdb"
 215                 emacs_gud_args=
 216                 ;;
 217         esac
 218         $EMACS --eval "($emacs_gud_cmd \"$GDB $emacs_gud_args -x $GDBSCR\")";
 219         rm -f $GDBSCR
 220         ;;
 221     dbx)
 222         $DBX -s $HOME/.dbxrc -c "loadobject -load libjvm.so; stop in JNI_CreateJavaVM; run $JPARMS; delete all" $LAUNCHER
 223         ;;
 224     valgrind)
 225         echo Warning: Defaulting to 16Mb heap to make Valgrind run faster, use -Xmx for larger heap
 226         echo
 227         $VALGRIND --tool=memcheck --leak-check=yes --num-callers=50 $LAUNCHER -Xmx16m $JPARMS
 228         ;;
 229     run)
 230         LD_PRELOAD=$PRELOADING exec $LAUNCHER $JPARMS
 231         ;;
 232     *)
 233         echo Error: Internal error, unknown launch mode \"$MODE\"
 234         exit 1
 235         ;;
 236 esac
 237 RETVAL=$?
 238 exit $RETVAL