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 # @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(500000); 64 objList.clear(); 65 System.gc(); 66 System.out.println("bottom of loop"); // @1 breakpoint 67 } 68 System.out.println("end of test"); // @1 breakpoint 69 } 70 } 71 72 EOF 73 } 74 75 # This is called to feed cmds to jdb. 76 dojdbCmds() 77 { 78 setBkpts @1 79 80 # get to the first loop breakpoint 81 runToBkpt 82 # 19 "cont" commands gets us through all the loop breakpoints. 83 # Use for-loop instead of while-loop to avoid creating processes 84 # for '[' and 'expr'. 85 for ii in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do 86 contToBkpt 87 done 88 # get to the last breakpoint 89 contToBkpt 90 } 91 92 93 mysetup() 94 { 95 if [ -z "$TESTSRC" ] ; then 96 TESTSRC=. 97 fi 98 99 for ii in . $TESTSRC $TESTSRC/.. ; do 100 if [ -r "$ii/ShellScaffold.sh" ] ; then 101 . $ii/ShellScaffold.sh 102 break 103 fi 104 done 105 } 106 107 # You could replace this next line with the contents 108 # of ShellScaffold.sh and this script will run just the same. 109 mysetup 110 111 runit 112 113 # make sure we hit the first breakpoint at least once 114 jdbFailIfNotPresent 'System\..*top of loop' 115 116 # make sure we hit the second breakpoint at least once 117 jdbFailIfNotPresent 'System\..*bottom of loop' 118 119 # make sure we hit the last breakpoint 120 jdbFailIfNotPresent 'System\..*end of test' 121 122 # make sure we had at least one full GC 123 debuggeeFailIfNotPresent 'Full GC' 124 125 # check for error message due to thread ID change 126 debuggeeFailIfPresent \ 127 'Exception in thread "event-handler" java.lang.NullPointerException' 128 129 pass