32 */ |
32 */ |
33 import java.io.BufferedReader; |
33 import java.io.BufferedReader; |
34 import java.io.IOException; |
34 import java.io.IOException; |
35 import java.io.InputStream; |
35 import java.io.InputStream; |
36 import java.io.InputStreamReader; |
36 import java.io.InputStreamReader; |
37 import java.io.OutputStream; |
|
38 import java.io.OutputStreamWriter; |
|
39 import java.io.Reader; |
|
40 import java.io.Writer; |
|
41 import java.util.Iterator; |
37 import java.util.Iterator; |
42 import java.util.List; |
38 import java.util.List; |
43 import java.util.Map; |
39 import java.util.Map; |
44 |
40 |
45 import com.sun.jdi.Bootstrap; |
41 import com.sun.jdi.Bootstrap; |
54 import com.sun.jdi.event.Event; |
50 import com.sun.jdi.event.Event; |
55 import com.sun.jdi.event.EventQueue; |
51 import com.sun.jdi.event.EventQueue; |
56 import com.sun.jdi.event.EventSet; |
52 import com.sun.jdi.event.EventSet; |
57 import com.sun.jdi.event.ModificationWatchpointEvent; |
53 import com.sun.jdi.event.ModificationWatchpointEvent; |
58 import com.sun.jdi.event.VMDeathEvent; |
54 import com.sun.jdi.event.VMDeathEvent; |
|
55 import com.sun.jdi.event.VMStartEvent; |
59 import com.sun.jdi.event.VMDisconnectEvent; |
56 import com.sun.jdi.event.VMDisconnectEvent; |
60 import com.sun.jdi.request.ClassPrepareRequest; |
57 import com.sun.jdi.request.ClassPrepareRequest; |
61 import com.sun.jdi.request.EventRequest; |
58 import com.sun.jdi.request.EventRequest; |
62 import com.sun.jdi.request.EventRequestManager; |
59 import com.sun.jdi.request.EventRequestManager; |
63 import com.sun.jdi.request.ModificationWatchpointRequest; |
60 import com.sun.jdi.request.ModificationWatchpointRequest; |
69 public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC"; |
66 public static final String ARGUMENTS = "-Xshare:off -XX:+PrintGC"; |
70 |
67 |
71 public static void main(String[] args) |
68 public static void main(String[] args) |
72 throws IOException, InterruptedException { |
69 throws IOException, InterruptedException { |
73 |
70 |
74 StringBuffer sb = new StringBuffer(); |
|
75 |
|
76 for (int i=0; i < args.length; i++) { |
|
77 sb.append(' '); |
|
78 sb.append(args[i]); |
|
79 } |
|
80 //VirtualMachine vm = launchTarget(sb.toString()); |
71 //VirtualMachine vm = launchTarget(sb.toString()); |
81 VirtualMachine vm = launchTarget(CLASS_NAME); |
72 VirtualMachine vm = launchTarget(CLASS_NAME); |
82 |
73 |
83 System.out.println("Vm launched"); |
74 System.out.println("Vm launched"); |
84 // set watch field on already loaded classes |
|
85 List<ReferenceType> referenceTypes = vm |
|
86 .classesByName(CLASS_NAME); |
|
87 for (ReferenceType refType : referenceTypes) { |
|
88 addFieldWatch(vm, refType); |
|
89 } |
|
90 // watch for loaded classes |
|
91 addClassWatch(vm); |
|
92 |
75 |
93 // process events |
76 // process events |
94 EventQueue eventQueue = vm.eventQueue(); |
77 EventQueue eventQueue = vm.eventQueue(); |
95 // resume the vm |
78 // resume the vm |
96 |
79 |
102 Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream()); |
85 Thread errThread = new StreamRedirectThread("error reader", process.getErrorStream()); |
103 |
86 |
104 errThread.start(); |
87 errThread.start(); |
105 outThread.start(); |
88 outThread.start(); |
106 |
89 |
107 |
|
108 vm.resume(); |
|
109 boolean connected = true; |
90 boolean connected = true; |
|
91 int watched = 0; |
110 while (connected) { |
92 while (connected) { |
111 EventSet eventSet = eventQueue.remove(); |
93 EventSet eventSet = eventQueue.remove(); |
112 for (Event event : eventSet) { |
94 for (Event event : eventSet) { |
113 if (event instanceof VMDeathEvent |
95 System.out.println("FieldMonitor-main receives: "+event); |
|
96 if (event instanceof VMStartEvent) { |
|
97 addClassWatch(vm); |
|
98 } else if (event instanceof VMDeathEvent |
114 || event instanceof VMDisconnectEvent) { |
99 || event instanceof VMDisconnectEvent) { |
115 // exit |
100 // exit |
116 connected = false; |
101 connected = false; |
117 } else if (event instanceof ClassPrepareEvent) { |
102 } else if (event instanceof ClassPrepareEvent) { |
118 // watch field on loaded class |
103 // watch field on loaded class |
120 ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event; |
105 ClassPrepareEvent classPrepEvent = (ClassPrepareEvent) event; |
121 ReferenceType refType = classPrepEvent |
106 ReferenceType refType = classPrepEvent |
122 .referenceType(); |
107 .referenceType(); |
123 addFieldWatch(vm, refType); |
108 addFieldWatch(vm, refType); |
124 } else if (event instanceof ModificationWatchpointEvent) { |
109 } else if (event instanceof ModificationWatchpointEvent) { |
|
110 watched++; |
125 System.out.println("sleep for 500 ms"); |
111 System.out.println("sleep for 500 ms"); |
126 Thread.sleep(500); |
112 Thread.sleep(500); |
127 System.out.println("resume..."); |
|
128 |
113 |
129 ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event; |
114 ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event; |
130 System.out.println("old=" |
115 System.out.println("old=" |
131 + modEvent.valueCurrent()); |
116 + modEvent.valueCurrent()); |
132 System.out.println("new=" + modEvent.valueToBe()); |
117 System.out.println("new=" + modEvent.valueToBe()); |
133 System.out.println(); |
|
134 } |
118 } |
135 } |
119 } |
|
120 System.out.println("resume..."); |
136 eventSet.resume(); |
121 eventSet.resume(); |
137 } |
122 } |
138 // Shutdown begins when event thread terminates |
123 // Shutdown begins when event thread terminates |
139 try { |
124 try { |
140 errThread.join(); // Make sure output is forwarded |
125 errThread.join(); // Make sure output is forwarded |
141 outThread.join(); |
126 outThread.join(); |
142 } catch (InterruptedException exc) { |
127 } catch (InterruptedException exc) { |
143 // we don't interrupt |
128 // we don't interrupt |
|
129 } |
|
130 |
|
131 if (watched != 11) { // init + 10 modifications in TestPostFieldModification class |
|
132 throw new Error("Expected to receive 11 times ModificationWatchpointEvent, but got "+watched); |
144 } |
133 } |
145 } |
134 } |
146 |
135 |
147 /** |
136 /** |
148 * Find a com.sun.jdi.CommandLineLaunch connector |
137 * Find a com.sun.jdi.CommandLineLaunch connector |