1 #!/bin/sh
   2 
   3 #
   4 # Copyright (c) 2002, 2014, 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 #  This is a manual test.  The script isn't smart enough
  28 #  to detect the correct ordering of the output since it
  29 #  is produced by multiple threads and can be interleaved
  30 #  in many different ways.
  31 #
  32 #  @bug 4629548
  33 #  @summary Deferred StepRequests are lost in multithreaded debuggee
  34 #  @author Jim Holmlund
  35 #
  36 #  @run shell/manual DeferredStepTest.sh
  37 
  38 #  Run this script to see the bug.  See comments at the end
  39 #  of the .java file for info on what the bug looks like.
  40 
  41 # These are variables that can be set to control execution
  42 
  43 #pkg=untitled7
  44 classname=DeferredStepTest
  45 #compileOptions=-g
  46 #java=java_g
  47 #mode=-Xcomp
  48 
  49 createJavaFile()
  50 {
  51     cat <<EOF > $classname.java.1
  52 public class $classname {
  53   static class  jj1 implements Runnable {
  54     public void  run() {
  55         int count = 0;
  56 
  57         for ( int ii = 0; ii < 10; ii++) {  // line 6
  58             int intInPotato04 = 666;        // line 7
  59             ++count;                        // line 8; @1 breakpoint
  60             System.out.println("Thread: " + Thread.currentThread().getName());  // line 9
  61         }
  62     }
  63   }
  64 
  65   static class jj2 implements Runnable {
  66     public void run() {
  67         int count2 = 0;
  68 
  69         for (int ii = 0; ii < 10; ii++) {      // line 18
  70             String StringInPotato05 = "I am";  // line 19
  71             ++count2;                          // line 20; @1 breakpoint
  72             System.out.println("Thread: " + Thread.currentThread().getName());  // line 21
  73         }
  74     }
  75   }
  76 
  77   public static void  main(String argv[]) {
  78       System.out.println("Version = " + System.getProperty("java.version"));
  79 
  80       jj1 aRP = new jj1();
  81       jj2 asRP = new jj2();
  82       new Thread(aRP,  "jj1 *").start();
  83       new Thread(asRP, "jj2 **").start();
  84 //    new Thread(aRP,  "jj3 ***").start();
  85 //    new Thread(asRP, "jj4 ****").start();
  86   }
  87 }
  88 
  89 /****************************
  90 To see this bug, do this
  91 
  92   jdb DeferredStep
  93   stop at DeferredStepTest$jj1:8
  94   stop at DeferredStepTest$jj2:20
  95   run
  96   next
  97   next
  98    :
  99 
 100 ********/
 101 
 102 EOF
 103 }
 104 
 105 #sleepcmd="sleep 2"
 106 
 107 # This is called to feed cmds to jdb.
 108 dojdbCmds()
 109 {
 110    #set -x
 111    # We can't use setBkpts because it can only set bkpts in one class :-(
 112    #setBkpts @1
 113    cmd stop at $classname'$jj1:8'
 114    cmd stop at $classname'$jj2:20'
 115    #cmd run; $sleepcmd
 116    runToBkpt @1
 117    cmd next; $sleepcmd
 118    cmd next; $sleepcmd
 119    cmd next; $sleepcmd
 120    cmd next; $sleepcmd
 121    cmd next; $sleepcmd
 122    cmd next; $sleepcmd
 123    cmd next; $sleepcmd
 124    cmd next; $sleepcmd
 125    cmd next; $sleepcmd
 126    cmd next; $sleepcmd
 127    cmd next; $sleepcmd
 128    cmd next; $sleepcmd
 129    cmd next; $sleepcmd
 130    cmd next; $sleepcmd
 131    cmd next; $sleepcmd
 132 }
 133 
 134 mysetup()
 135 {
 136     if [ -z "$TESTSRC" ] ; then
 137         TESTSRC=.
 138     fi
 139 
 140     for ii in . $TESTSRC $TESTSRC/.. ; do
 141         if [ -r "$ii/ShellScaffold.sh" ] ; then
 142             . $ii/ShellScaffold.sh
 143             break
 144         fi
 145     done
 146 }
 147 
 148 
 149 # You could replace this next line with the contents
 150 # of ShellScaffold.sh and this script will run just the same.
 151 mysetup
 152 
 153 cat <<EOF
 154 ****************************************************************
 155 This test should be run and checked manually.
 156 
 157 If this works right, you should see StepEvents/Breakpoint events for lines
 158    8, 9, 6, 7, 8, 9, 6, ....   for thread jj11
 159 and
 160   20, 21, 18, 19, 20, 21, 18, ... for thread jj2
 161 
 162 Since both threads are running at the same time, these
 163 events can be intermixed.
 164 
 165 The bug is that you will frequently see step events missing.
 166 EG, you will see
 167   8, 9, 8
 168 or
 169   20, 21, 20, 21
 170 etc
 171 
 172 ============================================================
 173 At some point you might get the msg 'Nothing suspended'
 174 This is bug:
 175    4619349 Step Over fails in a multi threaded debuggee
 176 
 177 Kill the test and rerun it if this happens.
 178 ****************************************************************
 179 
 180 EOF
 181 runit
 182 #jdbFailIfPresent "Nothing suspended"
 183 #pass