test/runtime/7158988/FieldMonitor.java
Print this page
@@ -32,14 +32,10 @@
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.sun.jdi.Bootstrap;
@@ -54,10 +50,11 @@
import com.sun.jdi.event.Event;
import com.sun.jdi.event.EventQueue;
import com.sun.jdi.event.EventSet;
import com.sun.jdi.event.ModificationWatchpointEvent;
import com.sun.jdi.event.VMDeathEvent;
+import com.sun.jdi.event.VMStartEvent;
import com.sun.jdi.event.VMDisconnectEvent;
import com.sun.jdi.request.ClassPrepareRequest;
import com.sun.jdi.request.EventRequest;
import com.sun.jdi.request.EventRequestManager;
import com.sun.jdi.request.ModificationWatchpointRequest;
@@ -69,28 +66,14 @@
public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC";
public static void main(String[] args)
throws IOException, InterruptedException {
- StringBuffer sb = new StringBuffer();
-
- for (int i=0; i < args.length; i++) {
- sb.append(' ');
- sb.append(args[i]);
- }
//VirtualMachine vm = launchTarget(sb.toString());
VirtualMachine vm = launchTarget(CLASS_NAME);
System.out.println("Vm launched");
- // set watch field on already loaded classes
- List<ReferenceType> referenceTypes = vm
- .classesByName(CLASS_NAME);
- for (ReferenceType refType : referenceTypes) {
- addFieldWatch(vm, refType);
- }
- // watch for loaded classes
- addClassWatch(vm);
// process events
EventQueue eventQueue = vm.eventQueue();
// resume the vm
@@ -102,17 +85,19 @@
Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream());
errThread.start();
outThread.start();
-
- vm.resume();
boolean connected = true;
+ boolean watched = false;
while (connected) {
EventSet eventSet = eventQueue.remove();
for (Event event : eventSet) {
- if (event instanceof VMDeathEvent
+ System.out.println("FieldMonitor-main receives: "+event);
+ if (event instanceof VMStartEvent) {
+ addClassWatch(vm);
+ } else if (event instanceof VMDeathEvent
|| event instanceof VMDisconnectEvent) {
// exit
connected = false;
} else if (event instanceof ClassPrepareEvent) {
// watch field on loaded class
@@ -120,10 +105,11 @@
ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event;
ReferenceType refType = classPrepEvent
.referenceType();
addFieldWatch(vm, refType);
} else if (event instanceof ModificationWatchpointEvent) {
+ watched = true;
System.out.println("sleep for 500 ms");
Thread.sleep(500);
System.out.println("resume...");
ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event;
@@ -140,10 +126,14 @@
errThread.join(); // Make sure output is forwarded
outThread.join();
} catch (InterruptedException exc) {
// we don't interrupt
}
+
+ if (!watched) {
+ throw new Error("Did not receive ModificationWatchpointEvent!");
+ }
}
/**
* Find a com.sun.jdi.CommandLineLaunch connector
*/