Name: rrC79099 Date: 11/16/99
The setSuspendPolicy(int) method in EventRequest when set after
enabling a
request has no effect. The API does not state whether suspend
policy has to be set before or after enabling the request.
When suspend policy is set after enabling a request it does not throw
any
execption also it does not work as expected.
Testing done in WinNT(JDK1.3.0-N build).
Steps to reporduce the error:
-----------------------------
1. Set the path to latest JDK(Kestrel).
2. Set classpath to <jdk>/lib/tools.jar
2. Compile all the attached files.
3. First start the Target VM with the command
java -Xdebug -Xnoagent
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,
address=5670 SampleTest
4. Start the debugger with the command
java SuspendTest
5. Supend policy SUSPEND_EVENT_THREAD set before enabling the request
gives
the following output:
-------
reference1 instance of ThreadTest(name='first', id=71)status is 1true
reference2 instance of ThreadTest(name='second', id=73)status is
-1false
reference3 instance of java.lang.Thread(name='Thread-2', id=72)status
is -1false
-------
Supend policy SUSPEND_EVENT_THREAD set after enabling the request gives
the following output:
-------
reference1 instance of ThreadTest(name='first', id=71)status is 1true
reference2 instance of ThreadTest(name='second', id=73)status is -1true
reference3 instance of java.lang.Thread(name='Thread-2', id=72)status
is -1true
-------
6. Output for testing by setting SUSPEND_ALL,SUSPEND_EVENT_THREAD
,SUSPEND_NONE
individually before and after enabling request are in suspend.html.
Attachments:
------------
1. JDIScaffold.java
2. VMConnection.java
3. SuspendTest.java
4. SampleTest.java - Target application
5. ThreadTest.java
6. suspend.html
*************************************************
import java.util.*;
import com.sun.jdi.*;
import com.sun.jdi.event.*;
import com.sun.jdi.request.*;
public class SuspendTest extends JDIScaffold {
final String[] args;
ReferenceType referenceType;
ThreadReference reference1, reference2, reference3;
EventRequestManager requestManager;
public static void main(String args[]) throws Exception {
new SuspendTest(args).startTests();
}
public SuspendTest(String args[]) {
super();
this.args = args;
}
protected void runTests() throws Exception {
connect(args);
waitForVMStart();
requestManager = vm().eventRequestManager();
ReferenceType referenceType =
resumeToPrepareOf("ThreadTest").referenceType();
BreakpointEvent breakEvent = resumeTo("ThreadTest","run","()V");
List allThreads = vm().allThreads();
for(int i=0;i<allThreads.size();i++) {
ThreadReference thread = (ThreadReference)allThreads.get(i);
if( thread.name().equals("first")) {
reference1 = thread;
} else if( thread.name().equals("second")) {
reference2 = thread;
} else if( thread.name().equals("Thread-2") ||
thread.name().equals("main")) {
reference3 = thread;
}
}
List locs = referenceType.locationsOfLine(10);
if (locs.size() == 0) {
throw new IllegalArgumentException("Bad line number");
} else if (locs.size() > 1) {
throw new IllegalArgumentException("Line number has multiple
locations");
}
Location location = (Location)locs.get(0);
BreakpointRequest request =
requestManager.createBreakpointRequest(location);
request.setSuspendPolicy(request.SUSPEND_EVENT_THREAD);
request.addThreadFilter(reference1);
request.enable();
//request.setSuspendPolicy(request.SUSPEND_EVENT_THREAD);
BreakpointEvent event = null;
for(int i=0;i<100;i++) {
event = (BreakpointEvent)waitForRequestedEvent(request);
System.out.println("reference1 " + reference1 + "status is " +
reference1.status()+ reference1.isSuspended());
System.out.println("reference2 " + reference2+ "status is " +
reference2.status()+ reference2.isSuspended());
System.out.println("reference3 " + reference3+ "status is " +
reference3.status()+ reference3.isSuspended());
}
}
}
*************************************************
public class SampleTest {
static ThreadTest firstthread, secondthread;
public static void main(String args[]) {
SampleTest sampletest = new SampleTest();
for(int i=0;i<10;i++) {
sampletest.testMethod();
}
firstthread = new ThreadTest();
firstthread.setName("first");
secondthread = new ThreadTest();
secondthread.setName("second");
sampletest.sampleMethod();
}
public void testMethod() {
System.out.println(" test message line");
}
public void sampleMethod() {
firstthread.start();
secondthread.start();
System.out.println("started both threads");
}
}
*************************************************
public class ThreadTest extends Thread {
public ThreadTest() {
}
public void run() {
while(true) {
System.out.println(" In thread " + currentThread());
}
}
}
*************************************************
======================================================================