JdbMethodExitTest.sh revision 0
#
# Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
# @test
# @bug 6202891
# @summary TTY: Add support for method exit event return values to jdb
# @author Jim Holmlund
# @run shell JdbMethodExitTest.sh
# These are variables that can be set to control execution
#pkg=untitled7
#java="java_g"
#set -x
{
cat <<EOF > $classname.java.1
import java.util.*;
import java.net.URLClassLoader;
import java.net.URL;
/*
* This tests the jdb trace command
*/
class $classname {
// These are the values that will be returned by the methods
static URL[] urls = new URL[1];
public static byte byteValue = 89;
public static char charValue = 'x';
public static double doubleValue = 2.2;
public static float floatValue = 3.3f;
public static int intValue = 1;
public static short shortValue = 8;
public static boolean booleanValue = false;
public static Class classValue = Object.class;
public static ClassLoader classLoaderValue;
{
try {
urls[0] = new URL("hi there");
} catch (java.net.MalformedURLException ee) {
}
classLoaderValue = new URLClassLoader(urls);
}
public static Thread threadValue;
public static ThreadGroup threadGroupValue;
public static String stringValue = "abc";
public static int[] intArrayValue = new int[] {1, 2, 3};
public static $classname objectValue =
new $classname();
public String ivar = stringValue;
// These are the instance methods
public byte i_bytef() { return byteValue; }
public char i_charf() { return charValue; }
public double i_doublef() { return doubleValue; }
public float i_floatf() { return floatValue; }
public int i_intf() { return intValue; }
public short i_shortf() { return shortValue; }
public boolean i_booleanf() { return booleanValue; }
public String i_stringf() { return stringValue; }
public Class i_classf() { return classValue; }
public ClassLoader i_classLoaderf()
{ return classLoaderValue; }
public Thread i_threadf() { return threadValue = Thread.currentThread(); }
public ThreadGroup i_threadGroupf()
{ return threadGroupValue = threadValue.getThreadGroup(); }
public int[] i_intArrayf() { return intArrayValue; }
public Object i_nullObjectf() { return null; }
public Object i_objectf() { return objectValue; }
public void i_voidf() {}
static void doit($classname xx) {
xx.i_bytef();
xx.i_charf();
xx.i_doublef();
xx.i_floatf();
xx.i_intf();
xx.i_shortf();
xx.i_booleanf();
xx.i_stringf();
xx.i_intArrayf();
xx.i_classf();
xx.i_classLoaderf();
xx.i_threadf();
xx.i_threadGroupf();
xx.i_nullObjectf();
xx.i_objectf();
xx.i_voidf();
// Prove it works for native methods too
StrictMath.sin(doubleValue);
stringValue.intern();
}
public static void bkpt() {
int i = 0; //@1 breakpoint
}
public static String traceMethods() {
return "traceMethods";
}
public static String traceMethods1() {
return "traceMethods1";
}
public static String traceExits() {
return "traceExits";
}
public static String traceExits1() {
return "traceExits1";
}
public static String traceExit() {
return "traceExit";
}
public static String traceExit1() {
return "traceExit1";
}
public static void main(String[] args) {
// The debugger will stop at the start of main,
// enable method exit events, and then do
// a resume.
$classname xx = new $classname();
bkpt();
// test all possible return types
doit(xx);
bkpt();
// test trace methods
traceMethods();
// test trace go methods
traceMethods1();
bkpt();
// test trace method exits
traceExits();
// test trace method exits
traceExits1();
bkpt();
// test trace method exit
traceExit();
// test trace method exit
traceExit1();
bkpt();
}
}
EOF
}
# drive jdb by sending cmds to it and examining its output
{
setBkpts @1
# test all possible return types
runToBkpt @1
jdbFailIfNotPresent "trace methods in effect"
jdbFailIfNotPresent "trace go methods in effect"
jdbFailIfNotPresent "trace method exits in effect"
jdbFailIfNotPresent "trace go method exits in effect"
jdbFailIfNotPresent "trace method exit in effect for JdbMethodExitTest.bkpt"
jdbFailIfNotPresent "trace go method exit in effect for JdbMethodExitTest.bkpt"
# trace exit of methods with all the return values
# (but just check a couple of them)
jdbFailIfNotPresent "instance of JdbMethodExitTest"
jdbFailIfNotPresent "return value = 8"
# Get out of bkpt back to the call to traceMethods
jdbFailIfNotPresent "Method entered:"
jdbFailIfNotPresent "Method exited: return value = \"traceMethods\""
jdbFailIfNotPresent "Method entered: \"thread=main\", JdbMethodExitTest.traceMethods1"
jdbFailIfNotPresent 'Method exited: .* JdbMethodExitTest.traceMethods1'
jdbFailIfNotPresent "Method exited: return value = \"traceExits\""
jdbFailIfNotPresent 'Method exited: .* JdbMethodExitTest.traceExits1'
jdbFailIfNotPresent "Method exited: return value = \"traceExit\""
jdbFailIfNotPresent 'Method exited: .*JdbMethodExitTest.traceExit1'
}
mysetup()
{
TESTSRC=.
fi
break
fi
done
}
# You could replace this next line with the contents
# of ShellScaffold.sh and this script will run just the same.
jdbFailIfNotPresent "Breakpoint hit"