1 #!/bin/sh 2 3 # 4 # Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. 5 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 6 # 7 # This code is free software; you can redistribute it and/or modify it 8 # under the terms of the GNU General Public License version 2 only, as 9 # published by the Free Software Foundation. 10 # 11 # This code is distributed in the hope that it will be useful, but WITHOUT 12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 # version 2 for more details (a copy is included in the LICENSE file that 15 # accompanied this code). 16 # 17 # You should have received a copy of the GNU General Public License version 18 # 2 along with this work; if not, write to the Free Software Foundation, 19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 # 21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 # or visit www.oracle.com if you need additional information or have any 23 # questions. 24 # 25 26 # @test 27 # @bug 6862295 28 # @summary Verify breakpoints still work after a full GC. 29 # @author dcubed (based on the test program posted to the following 30 # Eclipse thread https://bugs.eclipse.org/bugs/show_bug.cgi?id=279137) 31 # 32 # @run shell BreakpointWithFullGC.sh 33 34 compileOptions=-g 35 # Hijacking the mode parameter to make sure we use a small amount 36 # of memory and can see what GC is doing. 37 mode="-Xmx32m -verbose:gc" 38 # Force use of a GC framework collector to see the original failure. 39 #mode="$mode -XX:+UseSerialGC" 40 41 # Uncomment this to see the JDI trace 42 #jdbOptions=-dbgtrace 43 44 createJavaFile() 45 { 46 cat <<EOF > $1.java.1 47 48 import java.util.ArrayList; 49 import java.util.List; 50 51 public class $1 { 52 public static List<Object> objList = new ArrayList<Object>(); 53 54 private static void init(int numObjs) { 55 for (int i = 0; i < numObjs; i++) { 56 objList.add(new Object()); 57 } 58 } 59 60 public static void main(String[] args) { 61 for (int i = 0; i < 10; i++) { 62 System.out.println("top of loop"); // @1 breakpoint 63 init(1000000); 64 objList.clear(); 65 System.out.println("bottom of loop"); // @1 breakpoint 66 } 67 System.out.println("end of test"); // @1 breakpoint 68 } 69 } 70 71 EOF 72 } 73 74 # This is called to feed cmds to jdb. 75 dojdbCmds() 76 { 77 setBkpts @1 78 79 # get to the first loop breakpoint 80 runToBkpt 81 # 19 "cont" commands gets us through all the loop breakpoints. 82 # Use for-loop instead of while-loop to avoid creating processes 83 # for '[' and 'expr'. 84 for ii in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do 85 contToBkpt 86 done 87 # get to the last breakpoint 88 contToBkpt 89 } 90 91 92 mysetup() 93 { 94 if [ -z "$TESTSRC" ] ; then 95 TESTSRC=. 96 fi 97 98 for ii in . $TESTSRC $TESTSRC/.. ; do 99 if [ -r "$ii/ShellScaffold.sh" ] ; then 100 . $ii/ShellScaffold.sh 101 break 102 fi 103 done 104 } 105 106 # You could replace this next line with the contents 107 # of ShellScaffold.sh and this script will run just the same. 108 mysetup 109 110 runit 111 112 # make sure we hit the first breakpoint at least once 113 jdbFailIfNotPresent 'System\..*top of loop' 114 115 # make sure we hit the second breakpoint at least once 116 jdbFailIfNotPresent 'System\..*bottom of loop' 117 118 # make sure we hit the last breakpoint 119 jdbFailIfNotPresent 'System\..*end of test' 120 121 # make sure we had at least one full GC 122 debuggeeFailIfNotPresent 'Full GC' 123 124 # check for error message due to thread ID change 125 debuggeeFailIfPresent \ 126 'Exception in thread "event-handler" java.lang.NullPointerException' 127 128 pass