1 #!/bin/sh 2 3 # 4 # Copyright (c) 2009, 2013 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 # @key intermittent 33 # @run shell BreakpointWithFullGC.sh 34 35 compileOptions=-g 36 # Hijacking the mode parameter to make sure we use a small amount 37 # of memory and can see what GC is doing. 38 mode="-Xmx32m -verbose:gc" 39 # Force use of a GC framework collector to see the original failure. 40 #mode="$mode -XX:+UseSerialGC" 41 42 # Uncomment this to see the JDI trace 43 #jdbOptions=-dbgtrace 44 45 createJavaFile() 46 { 47 cat <<EOF > $1.java.1 48 49 import java.util.ArrayList; 50 import java.util.List; 51 52 public class $1 { 53 public static List<Object> objList = new ArrayList<Object>(); 54 55 private static void init(int numObjs) { 56 for (int i = 0; i < numObjs; i++) { 57 objList.add(new Object()); 58 } 59 } 60 61 public static void main(String[] args) { 62 for (int i = 0; i < 10; i++) { 63 System.out.println("top of loop"); // @1 breakpoint 64 init(500000); 65 objList.clear(); 66 System.gc(); 67 System.out.println("bottom of loop"); // @1 breakpoint 68 } 69 System.out.println("end of test"); // @1 breakpoint 70 } 71 } 72 73 EOF 74 } 75 76 # This is called to feed cmds to jdb. 77 dojdbCmds() 78 { 79 setBkpts @1 80 81 # get to the first loop breakpoint 82 runToBkpt 83 # 19 "cont" commands gets us through all the loop breakpoints. 84 # Use for-loop instead of while-loop to avoid creating processes 85 # for '[' and 'expr'. 86 for ii in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do 87 contToBkpt 88 done 89 # get to the last breakpoint 90 contToBkpt 91 } 92 93 94 mysetup() 95 { 96 if [ -z "$TESTSRC" ] ; then 97 TESTSRC=. 98 fi 99 100 for ii in . $TESTSRC $TESTSRC/.. ; do 101 if [ -r "$ii/ShellScaffold.sh" ] ; then 102 . $ii/ShellScaffold.sh 103 break 104 fi 105 done 106 } 107 108 # You could replace this next line with the contents 109 # of ShellScaffold.sh and this script will run just the same. 110 mysetup 111 112 runit 113 114 # make sure we hit the first breakpoint at least once 115 jdbFailIfNotPresent 'System\..*top of loop' 116 117 # make sure we hit the second breakpoint at least once 118 jdbFailIfNotPresent 'System\..*bottom of loop' 119 120 # make sure we hit the last breakpoint 121 jdbFailIfNotPresent 'System\..*end of test' 122 123 # make sure we had at least one full GC 124 # Prior to JDK9-B95, the pattern was 'Full GC' 125 debuggeeMatchRegexp '^.*?\bPause Full\b\(System.gc\(\)\)\b.*?$' 126 127 # check for error message due to thread ID change 128 debuggeeFailIfPresent \ 129 'Exception in thread "event-handler" java.lang.NullPointerException' 130 131 pass