# HG changeset patch # User amenkov # Date 1535413518 25200 # Node ID 2af74a1edb1194a8421f2292eefdf51c263b553b # Parent da387726a4f553bda4d8652f818229a566edb82d 8203393: com/sun/jdi/JdbMethodExitTest.sh and JdbExprTest.sh fail due to timeout Reviewed-by: sspitsyn, cjplummer diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/ProblemList.txt --- a/test/jdk/ProblemList.txt Mon Aug 27 03:48:41 2018 -0700 +++ b/test/jdk/ProblemList.txt Mon Aug 27 16:45:18 2018 -0700 @@ -838,10 +838,6 @@ com/sun/jdi/RedefineImplementor.sh 8004127 generic-all -com/sun/jdi/JdbExprTest.sh 8203393 solaris-all - -com/sun/jdi/JdbMethodExitTest.sh 8203393 solaris-all - com/sun/jdi/RepStep.java 8043571 generic-all com/sun/jdi/GetLocalVariables4Test.sh 8067354 windows-all diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/com/sun/jdi/JdbExprTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/com/sun/jdi/JdbExprTest.java Mon Aug 27 16:45:18 2018 -0700 @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4660158 + * @summary javac produces the inconsistent variable debug in while loops. + * @comment converted from test/jdk/com/sun/jdi/JdbExprTest.sh + * + * @library /test/lib + * @compile -g JdbExprTest.java + * @run main/othervm JdbExprTest + */ + +import lib.jdb.JdbCommand; +import lib.jdb.JdbTest; + +import java.util.*; +import java.net.URLClassLoader; +import java.net.URL; + +class JdbExprTestTarg { + static Long lMax = new Long(java.lang.Long.MAX_VALUE); // force initialization of Long class + static long aLong; + static int anInt; + static boolean aBoolean; + + public static void bkpt() { + int i = 0; //@1 breakpoint + } + + public static void main(String[] args) { + bkpt(); + } +} + +public class JdbExprTest extends JdbTest { + public static void main(String argv[]) { + new JdbExprTest().run(); + } + + private JdbExprTest() { + super(DEBUGGEE_CLASS); + } + + private static final String DEBUGGEE_CLASS = JdbExprTestTarg.class.getName(); + + @Override + protected void runCases() { + setBreakpoints(System.getProperty("test.src") + "/JdbExprTest.java", 1); + // Run to breakpoint #1 + execCommand(JdbCommand.run()) + .shouldContain("Breakpoint hit"); + + execCommand(JdbCommand.print("java.lang.Long.MAX_VALUE")) + .shouldContain(" = 9223372036854775807"); + + execCommand(JdbCommand.print("java.lang.Long.MIN_VALUE")) + .shouldContain(" = -9223372036854775808"); + + execCommand(JdbCommand.print("9223372036854775807L")) + .shouldContain("9223372036854775807L = 9223372036854775807"); + execCommand(JdbCommand.print("9223372036854775807")) + .shouldContain("9223372036854775807 = 9223372036854775807"); + + execCommand(JdbCommand.print("-9223372036854775807L")) + .shouldContain("-9223372036854775807L = -9223372036854775807"); + execCommand(JdbCommand.print("-9223372036854775807")) + .shouldContain("-9223372036854775807 = -9223372036854775807"); + + execCommand(JdbCommand.print("-1")) + .shouldContain("-1 = -1"); + execCommand(JdbCommand.print("1L")) + .shouldContain("1L = 1"); + execCommand(JdbCommand.print("-1L")) + .shouldContain("-1L = -1"); + execCommand(JdbCommand.print("0x1")) + .shouldContain("0x1 = 1"); + + jdb.command(JdbCommand.set("JdbExprTestTarg.aLong", "9223372036854775807L")); + execCommand(JdbCommand.print("JdbExprTestTarg.aLong")) + .shouldContain("JdbExprTestTarg.aLong = 9223372036854775807"); + + jdb.command(JdbCommand.set("JdbExprTestTarg.anInt", "java.lang.Integer.MAX_VALUE + 1")); + execCommand(JdbCommand.print("JdbExprTestTarg.anInt")) + .shouldContain("JdbExprTestTarg.anInt = -2147483648"); + + jdb.command(JdbCommand.set("JdbExprTestTarg.aLong", "java.lang.Integer.MAX_VALUE + 1L")); + execCommand(JdbCommand.print("JdbExprTestTarg.aLong")) + .shouldContain("JdbExprTestTarg.aLong = 2147483648"); + + execCommand(JdbCommand.set("JdbExprTestTarg.anInt", "0x80000000")) + .shouldMatch("InvalidTypeException: .* convert 2147483648 to int"); + execCommand(JdbCommand.set("JdbExprTestTarg.anInt", "0x8000000000000000L")) + .shouldContain("java.lang.NumberFormatException: For input string: \"8000000000000000\""); + + execCommand(JdbCommand.set("JdbExprTestTarg.anInt", "0x7fffffff")) + .shouldContain("0x7fffffff = 2147483647"); + execCommand(JdbCommand.set("JdbExprTestTarg.aLong", "0x7fffffffffffffff")) + .shouldContain("0x7fffffffffffffff = 9223372036854775807"); + + execCommand(JdbCommand.print("3.1415")) + .shouldContain("3.1415 = 3.1415"); + execCommand(JdbCommand.print("-3.1415")) + .shouldContain("-3.1415 = -3.1415"); + execCommand(JdbCommand.print("011")) + .shouldContain("011 = 9"); + + execCommand(JdbCommand.set("JdbExprTestTarg.aBoolean", "false")) + .shouldContain("JdbExprTestTarg.aBoolean = false = false"); + execCommand(JdbCommand.print("JdbExprTestTarg.aBoolean")) + .shouldContain("JdbExprTestTarg.aBoolean = false"); + execCommand(JdbCommand.print("!JdbExprTestTarg.aBoolean")) + .shouldContain("JdbExprTestTarg.aBoolean = true"); + + execCommand(JdbCommand.print("~1")) + .shouldContain("~1 = -2"); + } +} diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/com/sun/jdi/JdbExprTest.sh --- a/test/jdk/com/sun/jdi/JdbExprTest.sh Mon Aug 27 03:48:41 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# @test -# @bug 4660158 -# @author Staffan Larsen -# @key intermittent -# @run shell JdbExprTest.sh - -# These are variables that can be set to control execution - -#pkg=untitled7 -classname=JdbExprTest -compileOptions=-g -#java="java_g" -#set -x - -createJavaFile() -{ - cat < $classname.java.1 -import java.util.*; -import java.net.URLClassLoader; -import java.net.URL; - -class $classname { - - static Long lMax = new Long(java.lang.Long.MAX_VALUE); // force initialization of Long class - static long aLong; - static int anInt; - static boolean aBoolean; - - public static void bkpt() { - int i = 0; //@1 breakpoint - } - - public static void main(String[] args) { - bkpt(); - } -} -EOF -} - - -# drive jdb by sending cmds to it and examining its output -dojdbCmds() -{ - setBkpts @1 - runToBkpt @1 - - cmd print java.lang.Long.MAX_VALUE - jdbFailIfNotPresent " \= 9223372036854775807" 3 - - cmd print java.lang.Long.MIN_VALUE - jdbFailIfNotPresent " \= \-9223372036854775808" 3 - - cmd print 9223372036854775807L - jdbFailIfNotPresent "9223372036854775807L = 9223372036854775807" 3 - cmd print 9223372036854775807 - jdbFailIfNotPresent "9223372036854775807 = 9223372036854775807" 3 - - cmd print -9223372036854775807L - jdbFailIfNotPresent "\-9223372036854775807L = \-9223372036854775807" 3 - cmd print -9223372036854775807 - jdbFailIfNotPresent "\-9223372036854775807 = \-9223372036854775807" 3 - - cmd print -1 - jdbFailIfNotPresent "\-1 = \-1" 3 - cmd print 1L - jdbFailIfNotPresent "1L = 1" 3 - cmd print -1L - jdbFailIfNotPresent "\-1L = \-1" 3 - cmd print 0x1 - jdbFailIfNotPresent "0x1 = 1" 3 - - cmd set $classname.aLong = 9223372036854775807L - cmd print $classname.aLong - jdbFailIfNotPresent "$classname.aLong = 9223372036854775807" 3 - - cmd set $classname.anInt = java.lang.Integer.MAX_VALUE + 1 - cmd print $classname.anInt - jdbFailIfNotPresent "$classname.anInt = \-2147483648" 3 - - cmd set $classname.aLong = java.lang.Integer.MAX_VALUE + 1L - cmd print $classname.aLong - jdbFailIfNotPresent "$classname.aLong = 2147483648" 3 - - cmd set $classname.anInt = 0x80000000 - jdbFailIfNotPresent "InvalidTypeException: .* convert 2147483648 to int" 3 - cmd set $classname.anInt = 0x8000000000000000L - jdbFailIfNotPresent "java.lang.NumberFormatException: For input string: \"8000000000000000\"" 3 - - cmd set $classname.anInt = 0x7fffffff - jdbFailIfNotPresent "0x7fffffff = 2147483647" 3 - cmd set $classname.aLong = 0x7fffffffffffffff - jdbFailIfNotPresent "0x7fffffffffffffff = 9223372036854775807" 3 - - cmd print 3.1415 - jdbFailIfNotPresent "3.1415 = 3.1415" 3 - cmd print -3.1415 - jdbFailIfNotPresent "\-3.1415 = \-3.1415" 3 - cmd print 011 - jdbFailIfNotPresent "011 = 9" 3 - - cmd set $classname.aBoolean = false - jdbFailIfNotPresent "JdbExprTest.aBoolean = false = false" 3 - cmd print $classname.aBoolean - jdbFailIfNotPresent "JdbExprTest.aBoolean = false" 3 - cmd print !$classname.aBoolean - jdbFailIfNotPresent "JdbExprTest.aBoolean = true" 3 - - cmd print ~1 - jdbFailIfNotPresent "~1 = -2" 3 -} - - -mysetup() -{ - if [ -z "$TESTSRC" ] ; then - TESTSRC=. - fi - - for ii in . $TESTSRC $TESTSRC/.. ; do - if [ -r "$ii/ShellScaffold.sh" ] ; then - . $ii/ShellScaffold.sh - break - fi - done -} - -# You could replace this next line with the contents -# of ShellScaffold.sh and this script will run just the same. -mysetup - -runit -jdbFailIfNotPresent "Breakpoint hit" -pass diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/com/sun/jdi/JdbMethodExitTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/com/sun/jdi/JdbMethodExitTest.java Mon Aug 27 16:45:18 2018 -0700 @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.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 + * @comment converted from test/jdk/com/sun/jdi/JdbMethodExitTest.sh + * + * @library /test/lib + * @compile -g JdbMethodExitTest.java + * @run main/othervm JdbMethodExitTest + */ + +import jdk.test.lib.process.OutputAnalyzer; +import lib.jdb.JdbCommand; +import lib.jdb.JdbTest; + +import java.util.*; +import java.net.URLClassLoader; +import java.net.URL; +import java.util.stream.Collectors; + +/* + * This tests the jdb trace command + */ + +class JdbMethodExitTestTarg { + // 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("file:/foo"); + } 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 JdbMethodExitTestTarg objectValue = + new JdbMethodExitTestTarg(); + 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(JdbMethodExitTestTarg 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. + + JdbMethodExitTestTarg xx = new JdbMethodExitTestTarg(); + System.out.println("threadid="+Thread.currentThread().getId()); + 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(); + + } +} + +public class JdbMethodExitTest extends JdbTest { + public static void main(String argv[]) { + new JdbMethodExitTest().run(); + } + + private JdbMethodExitTest() { + super(DEBUGGEE_CLASS); + } + + private static final String DEBUGGEE_CLASS = JdbMethodExitTestTarg.class.getName(); + + @Override + protected void runCases() { + setBreakpoints(System.getProperty("test.src") + "/JdbMethodExitTest.java", 1); + + // test all possible return types + execCommand(JdbCommand.run()) + .shouldContain("Breakpoint hit"); + Integer threadId = Integer.parseInt( + new OutputAnalyzer(jdb.getDebuggeeOutput()) + .firstMatch("^threadid=(.*)$", 1)); + jdb.command(JdbCommand.untrace()); + + jdb.command(JdbCommand.traceMethods(false, null)); + execCommand(JdbCommand.trace()) + .shouldContain("trace methods in effect"); + + jdb.command(JdbCommand.traceMethods(true, null)); + execCommand(JdbCommand.trace()) + .shouldContain("trace go methods in effect"); + + jdb.command(JdbCommand.traceMethodExits(false, null)); + execCommand(JdbCommand.trace()) + .shouldContain("trace method exits in effect"); + + jdb.command(JdbCommand.traceMethodExits(true, null)); + execCommand(JdbCommand.trace()) + .shouldContain("trace go method exits in effect"); + + jdb.command(JdbCommand.traceMethodExit(false, null)); + execCommand(JdbCommand.trace()) + .shouldContain("trace method exit in effect for JdbMethodExitTestTarg.bkpt"); + + jdb.command(JdbCommand.traceMethodExit(true, null)); + execCommand(JdbCommand.trace()) + .shouldContain("trace go method exit in effect for JdbMethodExitTestTarg.bkpt"); + + + // trace exit of methods with all the return values + // (but just check a couple of them) + jdb.command(JdbCommand.traceMethodExits(true, threadId)); + execCommand(JdbCommand.cont()) + .shouldContain("instance of JdbMethodExitTestTarg") + .shouldContain("return value = 8"); + + // Get out of bkpt back to the call to traceMethods + jdb.command(JdbCommand.stepUp()); + + + jdb.command(JdbCommand.traceMethods(false, threadId)); + execCommand(JdbCommand.cont()) + .shouldContain("Method entered:"); + execCommand(JdbCommand.cont()) + .shouldContain("Method exited: return value = \"traceMethods\""); + jdb.command(JdbCommand.stepUp()); + + + List reply = new LinkedList<>(); + reply.addAll(jdb.command(JdbCommand.traceMethods(true, threadId))); + reply.addAll(jdb.command(JdbCommand.cont())); + reply.addAll(jdb.command(JdbCommand.cont())); + reply.addAll(jdb.command(JdbCommand.cont())); + new OutputAnalyzer(reply.stream().collect(Collectors.joining(lineSeparator))) + .shouldContain("Method entered: \"thread=main\", JdbMethodExitTestTarg.traceMethods1") + .shouldMatch("Method exited: .* JdbMethodExitTestTarg.traceMethods1"); + jdb.command(JdbCommand.untrace()); + jdb.command(JdbCommand.stepUp()); + + + reply.clear(); + reply.addAll(jdb.command(JdbCommand.traceMethodExits(false, threadId))); + reply.addAll(jdb.command(JdbCommand.cont())); + new OutputAnalyzer(reply.stream().collect(Collectors.joining(lineSeparator))) + .shouldContain("Method exited: return value = \"traceExits\""); + jdb.command(JdbCommand.untrace()); + jdb.command(JdbCommand.stepUp()); + + + reply.clear(); + reply.addAll(jdb.command(JdbCommand.traceMethodExits(true, threadId))); + reply.addAll(jdb.command(JdbCommand.cont())); + new OutputAnalyzer(reply.stream().collect(Collectors.joining(lineSeparator))) + .shouldMatch("Method exited: .* JdbMethodExitTestTarg.traceExits1"); + jdb.command(JdbCommand.untrace()); + jdb.command(JdbCommand.stepUp()); + + + reply.clear(); + reply.addAll(jdb.command(JdbCommand.step())); // step into traceExit() + reply.addAll(jdb.command(JdbCommand.traceMethodExit(false, threadId))); + reply.addAll(jdb.command(JdbCommand.cont())); + new OutputAnalyzer(reply.stream().collect(Collectors.joining(lineSeparator))) + .shouldContain("Method exited: return value = \"traceExit\""); + jdb.command(JdbCommand.untrace()); + jdb.command(JdbCommand.stepUp()); + + + reply.clear(); + reply.addAll(jdb.command(JdbCommand.step())); + reply.addAll(jdb.command(JdbCommand.step())); // skip over setting return value in caller :-( + reply.addAll(jdb.command(JdbCommand.traceMethodExit(true, threadId))); + reply.addAll(jdb.command(JdbCommand.cont())); + new OutputAnalyzer(reply.stream().collect(Collectors.joining(lineSeparator))) + .shouldMatch("Method exited: .*JdbMethodExitTestTarg.traceExit1"); + + new OutputAnalyzer(jdb.getJdbOutput()) + .shouldContain("Breakpoint hit"); + } +} diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/com/sun/jdi/JdbMethodExitTest.sh --- a/test/jdk/com/sun/jdi/JdbMethodExitTest.sh Mon Aug 27 03:48:41 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,308 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.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 -classname=JdbMethodExitTest -compileOptions=-g -#java="java_g" -#set -x - -createJavaFile() -{ - cat < $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("file:/foo"); - } 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(); - System.out.println("threadid="+Thread.currentThread().getId()); - 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 -dojdbCmds() -{ - setBkpts @1 - - # test all possible return types - runToBkpt @1 - debuggeeMatchRegexp "s/threadid=\(.*\)/\1/g" - threadid=$? - cmd untrace - - cmd trace methods - cmd trace - jdbFailIfNotPresent "trace methods in effect" - - cmd trace go methods - cmd trace - jdbFailIfNotPresent "trace go methods in effect" - - cmd trace method exits - cmd trace - jdbFailIfNotPresent "trace method exits in effect" - - cmd trace go method exits - cmd trace - jdbFailIfNotPresent "trace go method exits in effect" - - cmd trace method exit - cmd trace - jdbFailIfNotPresent "trace method exit in effect for JdbMethodExitTest.bkpt" - - cmd trace go method exit - cmd trace - 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) - cmd trace go method exits $threadid - cmd cont - jdbFailIfNotPresent "instance of JdbMethodExitTest" - jdbFailIfNotPresent "return value = 8" - - # Get out of bkpt back to the call to traceMethods - cmd step up - - - cmd trace methods $threadid - cmd cont - jdbFailIfNotPresent "Method entered:" - cmd cont - jdbFailIfNotPresent "Method exited: return value = \"traceMethods\"" - cmd step up - - - cmd trace go methods $threadid - cmd cont - cmd cont - cmd cont - jdbFailIfNotPresent "Method entered: \"thread=main\", JdbMethodExitTest.traceMethods1" - jdbFailIfNotPresent 'Method exited: .* JdbMethodExitTest.traceMethods1' - cmd untrace - cmd step up - - - cmd trace method exits $threadid - cmd cont - jdbFailIfNotPresent "Method exited: return value = \"traceExits\"" - cmd untrace - cmd step up - - - cmd trace go method exits $threadid - cmd cont - jdbFailIfNotPresent 'Method exited: .* JdbMethodExitTest.traceExits1' - cmd untrace - cmd step up - - - cmd step # step into traceExit() - cmd trace method exit $threadid - cmd cont - jdbFailIfNotPresent "Method exited: return value = \"traceExit\"" - cmd untrace - cmd step up - - - cmd step - cmd step # skip over setting return value in caller :-( - cmd trace go method exit $threadid - cmd cont - jdbFailIfNotPresent 'Method exited: .*JdbMethodExitTest.traceExit1' -} - - -mysetup() -{ - if [ -z "$TESTSRC" ] ; then - TESTSRC=. - fi - - for ii in . $TESTSRC $TESTSRC/.. ; do - if [ -r "$ii/ShellScaffold.sh" ] ; then - . $ii/ShellScaffold.sh - break - fi - done -} - -# You could replace this next line with the contents -# of ShellScaffold.sh and this script will run just the same. -mysetup - -runit -jdbFailIfNotPresent "Breakpoint hit" -pass diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/com/sun/jdi/lib/jdb/JdbCommand.java --- a/test/jdk/com/sun/jdi/lib/jdb/JdbCommand.java Mon Aug 27 03:48:41 2018 -0700 +++ b/test/jdk/com/sun/jdi/lib/jdb/JdbCommand.java Mon Aug 27 16:45:18 2018 -0700 @@ -148,4 +148,48 @@ return new JdbCommand("stop at " + targetClass + ":" + lineNum); } + public static JdbCommand step() { + return new JdbCommand("step"); + } + public static JdbCommand stepUp() { + return new JdbCommand("step up"); + } + + public static JdbCommand print(String expr) { + return new JdbCommand("print " + expr); + } + + public static JdbCommand set(String lvalue, String expr) { + return new JdbCommand("set " + lvalue + " = " + expr); + } + + // trace [go] methods [thread] + // -- trace method entries and exits. + // -- All threads are suspended unless 'go' is specified + // trace [go] method exit | exits [thread] + // -- trace the current method's exit, or all methods' exits + // -- All threads are suspended unless 'go' is specified + // untrace [methods] -- stop tracing method entrys and/or exits + public static JdbCommand trace(boolean go, String mode, Integer threadId) { + return new JdbCommand(" trace" + + (go ? " go" : "") + + (mode != null ? " " + mode : "") + + (threadId != null ? " " + threadId.toString() : "")); + } + // prints trace status + public static JdbCommand trace() { + return trace(false, null, null); + } + public static JdbCommand traceMethods(boolean go, Integer threadId) { + return trace(go, "methods", threadId); + } + public static JdbCommand traceMethodExit(boolean go, Integer threadId) { + return trace(go, "method exit", threadId); + } + public static JdbCommand traceMethodExits(boolean go, Integer threadId) { + return trace(go, "method exits", threadId); + } + public static JdbCommand untrace() { + return new JdbCommand("untrace"); + } } diff -r da387726a4f5 -r 2af74a1edb11 test/jdk/com/sun/jdi/lib/jdb/JdbTest.java --- a/test/jdk/com/sun/jdi/lib/jdb/JdbTest.java Mon Aug 27 03:48:41 2018 -0700 +++ b/test/jdk/com/sun/jdi/lib/jdb/JdbTest.java Mon Aug 27 16:45:18 2018 -0700 @@ -23,6 +23,8 @@ package lib.jdb; +import jdk.test.lib.process.OutputAnalyzer; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -111,4 +113,8 @@ return setBreakpoints(jdb, debuggeeClass, debuggeeSourcePath, id); } + protected OutputAnalyzer execCommand(JdbCommand cmd) { + List reply = jdb.command(cmd); + return new OutputAnalyzer(reply.stream().collect(Collectors.joining(lineSeparator))); + } }