History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/com/sun/tools/example/trace/Trace.java (1 of 18352 files). Show all

Unified · Split

java/pkg/com/sun/tools/example/trace/Trace.java+237−0
@@ -0,0 +1,237 @@
1/*
2 * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
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
26package com.sun.tools.example.trace;
27
28import com.sun.jdi.VirtualMachine;
29import com.sun.jdi.Bootstrap;
30import com.sun.jdi.connect.*;
31
32import java.util.Map;
33import java.util.List;
34
35import java.io.PrintWriter;
36import java.io.FileWriter;
37import java.io.IOException;
38
39/**
40 * This program traces the execution of another program.
41 * See "java Trace -help".
42 * It is a simple example of the use of the Java Debug Interface.
43 *
44 * @author Robert Field
45 */
46public class Trace {
47
48 // Running remote VM
49 private final VirtualMachine vm;
50
51 // Thread transferring remote error stream to our error stream
52 private Thread errThread = null;
53
54 // Thread transferring remote output stream to our output stream
55 private Thread outThread = null;
56
57 // Mode for tracing the Trace program (default= 0 off)
58 private int debugTraceMode = 0;
59
60 // Do we want to watch assignments to fields
61 private boolean watchFields = false;
62
63 // Class patterns for which we don't want events
64 private String[] excludes = {"java.*", "javax.*", "sun.*",
65 "com.sun.*"};
66
67 /**
68 * main
69 */
70 public static void main(String[] args) {
71 new Trace(args);
72 }
73
74 /**
75 * Parse the command line arguments.
76 * Launch target VM.
77 * Generate the trace.
78 */
79 Trace(String[] args) {
80 PrintWriter writer = new PrintWriter(System.out);
81 int inx;
82 for (inx = 0; inx < args.length; ++inx) {
83 String arg = args[inx];
84 if (arg.charAt(0) != '-') {
85 break;
86 }
87 if (arg.equals("-output")) {
88 try {
89 writer = new PrintWriter(new FileWriter(args[++inx]));
90 } catch (IOException exc) {
91 System.err.println("Cannot open output file: " + args[inx]
92 + " - " + exc);
93 System.exit(1);
94 }
95 } else if (arg.equals("-all")) {
96 excludes = new String[0];
97 } else if (arg.equals("-fields")) {
98 watchFields = true;
99 } else if (arg.equals("-dbgtrace")) {
100 debugTraceMode = Integer.parseInt(args[++inx]);
101 } else if (arg.equals("-help")) {
102 usage();
103 System.exit(0);
104 } else {
105 System.err.println("No option: " + arg);
106 usage();
107 System.exit(1);
108 }
109 }
110 if (inx >= args.length) {
111 System.err.println("<class> missing");
112 usage();
113 System.exit(1);
114 }
115 StringBuffer sb = new StringBuffer();
116 sb.append(args[inx]);
117 for (++inx; inx < args.length; ++inx) {
118 sb.append(' ');
119 sb.append(args[inx]);
120 }
121 vm = launchTarget(sb.toString());
122 generateTrace(writer);
123 }
124
125
126 /**
127 * Generate the trace.
128 * Enable events, start thread to display events,
129 * start threads to forward remote error and output streams,
130 * resume the remote VM, wait for the final event, and shutdown.
131 */
132 void generateTrace(PrintWriter writer) {
133 vm.setDebugTraceMode(debugTraceMode);
134 EventThread eventThread = new EventThread(vm, excludes, writer);
135 eventThread.setEventRequests(watchFields);
136 eventThread.start();
137 redirectOutput();
138 vm.resume();
139
140 // Shutdown begins when event thread terminates
141 try {
142 eventThread.join();
143 errThread.join(); // Make sure output is forwarded
144 outThread.join(); // before we exit
145 } catch (InterruptedException exc) {
146 // we don't interrupt
147 }
148 writer.close();
149 }
150
151 /**
152 * Launch target VM.
153 * Forward target's output and error.
154 */
155 VirtualMachine launchTarget(String mainArgs) {
156 LaunchingConnector connector = findLaunchingConnector();
157 Map<String, Connector.Argument> arguments =
158 connectorArguments(connector, mainArgs);
159 try {
160 return connector.launch(arguments);
161 } catch (IOException exc) {
162 throw new Error("Unable to launch target VM: " + exc);
163 } catch (IllegalConnectorArgumentsException exc) {
164 throw new Error("Internal error: " + exc);
165 } catch (VMStartException exc) {
166 throw new Error("Target VM failed to initialize: " +
167 exc.getMessage());
168 }
169 }
170
171 void redirectOutput() {
172 Process process = vm.process();
173
174 // Copy target's output and error to our output and error.
175 errThread = new StreamRedirectThread("error reader",
176 process.getErrorStream(),
177 System.err);
178 outThread = new StreamRedirectThread("output reader",
179 process.getInputStream(),
180 System.out);
181 errThread.start();
182 outThread.start();
183 }
184
185 /**
186 * Find a com.sun.jdi.CommandLineLaunch connector
187 */
188 LaunchingConnector findLaunchingConnector() {
189 List<Connector> connectors = Bootstrap.virtualMachineManager().allConnectors();
190 for (Connector connector : connectors) {
191 if (connector.name().equals("com.sun.jdi.CommandLineLaunch")) {
192 return (LaunchingConnector)connector;
193 }
194 }
195 throw new Error("No launching connector");
196 }
197
198 /**
199 * Return the launching connector's arguments.
200 */
201 Map<String, Connector.Argument> connectorArguments(LaunchingConnector connector, String mainArgs) {
202 Map<String, Connector.Argument> arguments = connector.defaultArguments();
203 Connector.Argument mainArg =
204 (Connector.Argument)arguments.get("main");
205 if (mainArg == null) {
206 throw new Error("Bad launching connector");
207 }
208 mainArg.setValue(mainArgs);
209
210 if (watchFields) {
211 // We need a VM that supports watchpoints
212 Connector.Argument optionArg =
213 (Connector.Argument)arguments.get("options");
214 if (optionArg == null) {
215 throw new Error("Bad launching connector");
216 }
217 optionArg.setValue("-classic");
218 }
219 return arguments;
220 }
221
222 /**
223 * Print command line usage help
224 */
225 void usage() {
226 System.err.println("Usage: java Trace <options> <class> <args>");
227 System.err.println("<options> are:");
228 System.err.println(
229" -output <filename> Output trace to <filename>");
230 System.err.println(
231" -all Include system classes in output");
232 System.err.println(
233" -help Print this help message");
234 System.err.println("<class> is the program to trace");
235 System.err.println("<args> are the arguments to <class>");
236 }
237}