1#!/bin/sh
2
3# Copyright (c) 2010, 2015, 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
47if [ ! "$GDB" ]
48then
49    GDB=gdb
50fi
51
52# This is the name of the dbx binary to use
53if [ ! "$DBX" ]
54then
55    DBX=dbx
56fi
57
58# This is the name of the Valgrind binary to use
59if [ ! "$VALGRIND" ]
60then
61    VALGRIND=valgrind
62fi
63
64# This is the name of Emacs for running GUD
65EMACS=emacs
66
67#
68# End of user changeable parameters -----------------------------------------
69#
70
71OS=`uname -s`
72
73# Make sure the paths are fully specified, i.e. they must begin with /.
74REL_MYDIR=`dirname $0`
75MYDIR=`cd $REL_MYDIR && pwd`
76case "$OS" in
77CYGWIN*)
78    MYDIR=`cygpath -m "$MYDIR"`
79    ;;
80esac
81
82#
83# Look whether the user wants to run inside gdb
84case "$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        ;;
104esac
105
106if [ "${ALT_JAVA_HOME}" != "" ]; then
107    JDK=${ALT_JAVA_HOME%%/jre}
108else
109    JDK=@@JDK_IMPORT_PATH@@
110fi
111
112if [ "${JDK}" != "" ]; then
113    case "$OS" in
114    CYGWIN*)
115        JDK=`cygpath -m "$JDK"`
116        ;;
117	esac
118
119else
120    echo "Failed to find JDK." \
121        "Either ALT_JAVA_HOME is not set or JDK_IMPORT_PATH is empty."
122    exit 1
123fi
124
125# We will set the LD_LIBRARY_PATH as follows:
126#     o		$JVMPATH (directory portion only)
127#     o		$JRE/lib
128# followed by the user's previous effective LD_LIBRARY_PATH, if
129# any.
130JRE=$JDK
131JAVA_HOME=$JDK
132export JAVA_HOME
133
134SBP=${MYDIR}:${JRE}/lib
135
136
137# Set up a suitable LD_LIBRARY_PATH or DYLD_LIBRARY_PATH
138if [ "${OS}" = "Darwin" ]
139then
140    if [ -z "$DYLD_LIBRARY_PATH" ]
141    then
142        DYLD_LIBRARY_PATH="$SBP"
143    else
144        DYLD_LIBRARY_PATH="$SBP:$DYLD_LIBRARY_PATH"
145    fi
146    export DYLD_LIBRARY_PATH
147else
148    # not 'Darwin'
149    if [ -z "$LD_LIBRARY_PATH" ]
150    then
151        LD_LIBRARY_PATH="$SBP"
152    else
153        LD_LIBRARY_PATH="$SBP:$LD_LIBRARY_PATH"
154    fi
155    export LD_LIBRARY_PATH
156fi
157
158JPARMS="-XXaltjvm=$MYDIR -Dsun.java.launcher.is_altjvm=true";
159
160# Locate the java launcher
161LAUNCHER=$JDK/bin/java
162if [ ! -x $LAUNCHER ] ; then
163    echo Error: Cannot find the java launcher \"$LAUNCHER\"
164    exit 1
165fi
166
167GDBSRCDIR=$MYDIR
168BASEDIR=`cd $MYDIR/../../.. && pwd`
169case "$OS" in
170CYGWIN*)
171    BASEDIR=`cygpath -m "$BASEDIR"`
172    ;;
173esac
174
175init_gdb() {
176# Create a gdb script in case we should run inside gdb
177    GDBSCR=/tmp/hsl.$$
178    rm -f $GDBSCR
179    cat >>$GDBSCR <<EOF
180cd `pwd`
181handle SIGUSR1 nostop noprint
182handle SIGUSR2 nostop noprint
183directory $GDBSRCDIR
184# Get us to a point where we can set breakpoints in libjvm.so
185set breakpoint pending on
186break JNI_CreateJavaVM
187run
188# Stop in JNI_CreateJavaVM
189delete 1
190# We can now set breakpoints wherever we like
191EOF
192}
193
194case "$MODE" in
195    gdb)
196	init_gdb
197        $GDB -x $GDBSCR --args $LAUNCHER $JPARMS "$@" $JAVA_ARGS
198	rm -f $GDBSCR
199        ;;
200    gud)
201	init_gdb
202# First find out what emacs version we're using, so that we can
203# use the new pretty GDB mode if emacs -version >= 22.1
204	case `$EMACS -version 2> /dev/null` in
205	    *GNU\ Emacs\ 2[23]*)
206	    emacs_gud_cmd="gdba"
207	    emacs_gud_args="--annotate=3"
208	    ;;
209	    *)
210		emacs_gud_cmd="gdb"
211		emacs_gud_args=
212		;;
213	esac
214        $EMACS --eval "($emacs_gud_cmd \"$GDB $emacs_gud_args -x $GDBSCR\")";
215	rm -f $GDBSCR
216        ;;
217    dbx)
218        $DBX -s $HOME/.dbxrc -c "loadobject -load libjvm.so; stop in JNI_CreateJavaVM; run $JPARMS $@ $JAVA_ARGS; delete all" $LAUNCHER
219        ;;
220    valgrind)
221        echo Warning: Defaulting to 16Mb heap to make Valgrind run faster, use -Xmx for larger heap
222        echo
223        $VALGRIND --tool=memcheck --leak-check=yes --num-callers=50 $LAUNCHER -Xmx16m $JPARMS "$@" $JAVA_ARGS
224        ;;
225    run)
226        LD_PRELOAD=$PRELOADING exec $LAUNCHER $JPARMS "$@" $JAVA_ARGS
227        ;;
228    *)
229        echo Error: Internal error, unknown launch mode \"$MODE\"
230        exit 1
231        ;;
232esac
233RETVAL=$?
234exit $RETVAL
235