RFR JDK-8170089: nsk/jdi/EventSet/resume/resume008: ERROR: suspendCounts don't match for : Common-Cleaner

Gary Adams gary.adams at oracle.com
Fri Aug 3 18:04:31 UTC 2018


Here is an updated webrev with the alternate solution implemented for
resume 1 to 10. The debugger sets testCase variable in the debuggee
when each test case completes in the debugger. By having the debuggee
wait for the debugger to complete with test case 0, it avoids the 
interference
that occurs by proceeding to the breakpoint set in MethodForCommunication
before the debugger has compared expected suspend counts.

   Webrev: http://cr.openjdk.java.net/~gadams/8170089/webrev.01/index.html

On 7/17/18, 11:33 AM, Gary Adams wrote:
> A race condition exists between the debugger and the debuggee.
>
> The first test thread is started with SUSPEND_NONE policy set.
> While processing the thread start event the debugger captures
> an initial set of thread suspend counts and resumes the
> debuggee vm. If the debuggee advances quickly it reaches
> the breakpoint set for methodForCommunication. Since the breakpoint
> carries with it SUSPEND_ALL policy, when the debugger captures a second
> set of suspend counts, it will not match the expected counts for
> a SUSPEND_NONE scenario.
>
> The proposed fix introduces a yield in the debuggee test thread run 
> method
> to allow the debugger to get the expected sampled values.
>
>   Issue: https://bugs.openjdk.java.net/browse/JDK-8170089
>   Webrev: http://cr.openjdk.java.net/~gadams/8170089/webrev.00/
>
>
> test/hotspot/jtreg/vmTestbase/nsk/share/jdi/TestDebuggerType1.java:
> ...
>    186        private void setCommunicationBreakpoint(ReferenceType 
> refType, String methodName) {
>    187            Method method = debuggee.methodByName(refType, 
> methodName);
>    188            Location location = null;
>    189            try {
>    190                location = method.allLineLocations().get(0);
>    191            } catch (AbsentInformationException e) {
>    192                throw new Failure(e);
>    193            }
>    194            bpRequest = debuggee.makeBreakpoint(location);
>    195
>
>    196            bpRequest.setSuspendPolicy(EventRequest.SUSPEND_ALL);
>
>    197            bpRequest.putProperty("number", "zero");
>    198            bpRequest.enable();
>    199
>    200            eventHandler.addListener(
>    201                 new EventHandler.EventListener() {
>    202                     public boolean eventReceived(Event event) {
>    203                        if (event instanceof BreakpointEvent && 
> bpRequest.equals(event.request())) {
>    204                            synchronized(eventHandler) {
>    205                                display("Received communication 
> breakpoint event.");
>    206                                bpCount++;
>    207                                eventHandler.notifyAll();
>    208                            }
>    209                            return true;
>    210                        }
>    211                        return false;
>    212                     }
>    213                 }
>    214            );
>    215        }
>
>
> test/hotspot/jtreg/vmTestbase/nsk/jdi/EventSet/resume/resume008.java:
> ...
>    140                    display("......--> vm.suspend();");
>    141                    vm.suspend();
>    142
>    143                    display("        getting : Map<String, 
> Integer> suspendsCounts1");
>    144
>    145                    Map<String, Integer> suspendsCounts1 = new 
> HashMap<String, Integer>();
>    146                    for (ThreadReference threadReference : 
> vm.allThreads()) {
>    147                        
> suspendsCounts1.put(threadReference.name(), 
> threadReference.suspendCount());
>    148                    }
>    149                    display(suspendsCounts1.toString());
>    150
>    151                    display("        eventSet.resume;");
>    152                    eventSet.resume();
>    153
>    154                    display("        getting : Map<String, 
> Integer> suspendsCounts2");
>
> This is where the breakpoint is encountered before the second set of 
> suspend counts is acquired.
>
>    155                    Map<String, Integer> suspendsCounts2 = new 
> HashMap<String, Integer>();
>    156                    for (ThreadReference threadReference : 
> vm.allThreads()) {
>    157                        
> suspendsCounts2.put(threadReference.name(), 
> threadReference.suspendCount());
>    158                    }
>    159                    display(suspendsCounts2.toString());
>



More information about the serviceability-dev mailing list