Thu, 21 Dec 2017 19:11:17 -0500
8031304: Add dcmd to print all loaded dynamic libraries.
Summary: Adding VM.dynlibs as a dcmd to dump all loaded dynamic libraries.
Reviewed-by: fparain, mgronlun
1 /*
2 * Copyright (c) 2011, 2017, 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #ifndef SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
26 #define SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
28 #include "runtime/arguments.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "utilities/ostream.hpp"
31 #include "runtime/vm_version.hpp"
32 #include "runtime/vmThread.hpp"
33 #include "runtime/os.hpp"
34 #include "services/diagnosticArgument.hpp"
35 #include "services/diagnosticCommand.hpp"
36 #include "services/diagnosticFramework.hpp"
37 #include "services/diagnosticCommand_ext.hpp"
38 #include "utilities/macros.hpp"
40 class HelpDCmd : public DCmdWithParser {
41 protected:
42 DCmdArgument<bool> _all;
43 DCmdArgument<char*> _cmd;
44 public:
45 HelpDCmd(outputStream* output, bool heap);
46 static const char* name() { return "help"; }
47 static const char* description() {
48 return "For more information about a specific command use 'help <command>'. "
49 "With no argument this will show a list of available commands. "
50 "'help all' will show help for all commands.";
51 }
52 static const char* impact() { return "Low"; }
53 static int num_arguments();
54 virtual void execute(DCmdSource source, TRAPS);
55 };
57 class VersionDCmd : public DCmd {
58 public:
59 VersionDCmd(outputStream* output, bool heap) : DCmd(output,heap) { }
60 static const char* name() { return "VM.version"; }
61 static const char* description() {
62 return "Print JVM version information.";
63 }
64 static const char* impact() { return "Low"; }
65 static const JavaPermission permission() {
66 JavaPermission p = {"java.util.PropertyPermission",
67 "java.vm.version", "read"};
68 return p;
69 }
70 static int num_arguments() { return 0; }
71 virtual void execute(DCmdSource source, TRAPS);
72 };
74 class CommandLineDCmd : public DCmd {
75 public:
76 CommandLineDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
77 static const char* name() { return "VM.command_line"; }
78 static const char* description() {
79 return "Print the command line used to start this VM instance.";
80 }
81 static const char* impact() { return "Low"; }
82 static const JavaPermission permission() {
83 JavaPermission p = {"java.lang.management.ManagementPermission",
84 "monitor", NULL};
85 return p;
86 }
87 static int num_arguments() { return 0; }
88 virtual void execute(DCmdSource source, TRAPS) {
89 Arguments::print_on(_output);
90 }
91 };
93 // See also: get_system_properties in attachListener.cpp
94 class PrintSystemPropertiesDCmd : public DCmd {
95 public:
96 PrintSystemPropertiesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
97 static const char* name() { return "VM.system_properties"; }
98 static const char* description() {
99 return "Print system properties.";
100 }
101 static const char* impact() {
102 return "Low";
103 }
104 static const JavaPermission permission() {
105 JavaPermission p = {"java.util.PropertyPermission",
106 "*", "read"};
107 return p;
108 }
109 static int num_arguments() { return 0; }
110 virtual void execute(DCmdSource source, TRAPS);
111 };
113 // See also: print_flag in attachListener.cpp
114 class PrintVMFlagsDCmd : public DCmdWithParser {
115 protected:
116 DCmdArgument<bool> _all;
117 public:
118 PrintVMFlagsDCmd(outputStream* output, bool heap);
119 static const char* name() { return "VM.flags"; }
120 static const char* description() {
121 return "Print VM flag options and their current values.";
122 }
123 static const char* impact() {
124 return "Low";
125 }
126 static const JavaPermission permission() {
127 JavaPermission p = {"java.lang.management.ManagementPermission",
128 "monitor", NULL};
129 return p;
130 }
131 static int num_arguments();
132 virtual void execute(DCmdSource source, TRAPS);
133 };
135 class VMDynamicLibrariesDCmd : public DCmd {
136 public:
137 VMDynamicLibrariesDCmd(outputStream* output, bool heap);
138 static const char* name() {
139 return "VM.dynlibs";
140 }
141 static const char* description() {
142 return "Print loaded dynamic libraries.";
143 }
144 static const char* impact() {
145 return "Low";
146 }
147 static const JavaPermission permission() {
148 JavaPermission p = {"java.lang.management.ManagementPermission",
149 "monitor", NULL};
150 return p;
151 }
152 static int num_arguments() {
153 return 0;
154 };
155 virtual void execute(DCmdSource source, TRAPS);
156 };
158 class VMUptimeDCmd : public DCmdWithParser {
159 protected:
160 DCmdArgument<bool> _date;
161 public:
162 VMUptimeDCmd(outputStream* output, bool heap);
163 static const char* name() { return "VM.uptime"; }
164 static const char* description() {
165 return "Print VM uptime.";
166 }
167 static const char* impact() {
168 return "Low";
169 }
170 static int num_arguments();
171 virtual void execute(DCmdSource source, TRAPS);
172 };
174 class SystemGCDCmd : public DCmd {
175 public:
176 SystemGCDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
177 static const char* name() { return "GC.run"; }
178 static const char* description() {
179 return "Call java.lang.System.gc().";
180 }
181 static const char* impact() {
182 return "Medium: Depends on Java heap size and content.";
183 }
184 static int num_arguments() { return 0; }
185 virtual void execute(DCmdSource source, TRAPS);
186 };
188 class RunFinalizationDCmd : public DCmd {
189 public:
190 RunFinalizationDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
191 static const char* name() { return "GC.run_finalization"; }
192 static const char* description() {
193 return "Call java.lang.System.runFinalization().";
194 }
195 static const char* impact() {
196 return "Medium: Depends on Java content.";
197 }
198 static int num_arguments() { return 0; }
199 virtual void execute(DCmdSource source, TRAPS);
200 };
202 class HeapInfoDCmd : public DCmd {
203 public:
204 HeapInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
205 static const char* name() { return "GC.heap_info"; }
206 static const char* description() {
207 return "Provide generic Java heap information.";
208 }
209 static const char* impact() {
210 return "Medium";
211 }
212 static int num_arguments() { return 0; }
213 static const JavaPermission permission() {
214 JavaPermission p = {"java.lang.management.ManagementPermission",
215 "monitor", NULL};
216 return p;
217 }
219 virtual void execute(DCmdSource source, TRAPS);
220 };
222 class FinalizerInfoDCmd : public DCmd {
223 public:
224 FinalizerInfoDCmd(outputStream* output, bool heap) : DCmd(output, heap) { }
225 static const char* name() { return "GC.finalizer_info"; }
226 static const char* description() {
227 return "Provide information about Java finalization queue.";
228 }
229 static const char* impact() {
230 return "Medium";
231 }
232 static int num_arguments() { return 0; }
233 static const JavaPermission permission() {
234 JavaPermission p = {"java.lang.management.ManagementPermission",
235 "monitor", NULL};
236 return p;
237 }
239 virtual void execute(DCmdSource source, TRAPS);
240 };
242 #if INCLUDE_SERVICES // Heap dumping supported
243 // See also: dump_heap in attachListener.cpp
244 class HeapDumpDCmd : public DCmdWithParser {
245 protected:
246 DCmdArgument<char*> _filename;
247 DCmdArgument<bool> _all;
248 public:
249 HeapDumpDCmd(outputStream* output, bool heap);
250 static const char* name() {
251 return "GC.heap_dump";
252 }
253 static const char* description() {
254 return "Generate a HPROF format dump of the Java heap.";
255 }
256 static const char* impact() {
257 return "High: Depends on Java heap size and content. "
258 "Request a full GC unless the '-all' option is specified.";
259 }
260 static const JavaPermission permission() {
261 JavaPermission p = {"java.lang.management.ManagementPermission",
262 "monitor", NULL};
263 return p;
264 }
265 static int num_arguments();
266 virtual void execute(DCmdSource source, TRAPS);
267 };
268 #endif // INCLUDE_SERVICES
270 // See also: inspectheap in attachListener.cpp
271 class ClassHistogramDCmd : public DCmdWithParser {
272 protected:
273 DCmdArgument<bool> _all;
274 public:
275 ClassHistogramDCmd(outputStream* output, bool heap);
276 static const char* name() {
277 return "GC.class_histogram";
278 }
279 static const char* description() {
280 return "Provide statistics about the Java heap usage.";
281 }
282 static const char* impact() {
283 return "High: Depends on Java heap size and content.";
284 }
285 static const JavaPermission permission() {
286 JavaPermission p = {"java.lang.management.ManagementPermission",
287 "monitor", NULL};
288 return p;
289 }
290 static int num_arguments();
291 virtual void execute(DCmdSource source, TRAPS);
292 };
294 class ClassStatsDCmd : public DCmdWithParser {
295 protected:
296 DCmdArgument<bool> _all;
297 DCmdArgument<bool> _csv;
298 DCmdArgument<bool> _help;
299 DCmdArgument<char*> _columns;
300 public:
301 ClassStatsDCmd(outputStream* output, bool heap);
302 static const char* name() {
303 return "GC.class_stats";
304 }
305 static const char* description() {
306 return "Provide statistics about Java class meta data. Requires -XX:+UnlockDiagnosticVMOptions.";
307 }
308 static const char* impact() {
309 return "High: Depends on Java heap size and content.";
310 }
311 static int num_arguments();
312 virtual void execute(DCmdSource source, TRAPS);
313 };
315 // See also: thread_dump in attachListener.cpp
316 class ThreadDumpDCmd : public DCmdWithParser {
317 protected:
318 DCmdArgument<bool> _locks;
319 public:
320 ThreadDumpDCmd(outputStream* output, bool heap);
321 static const char* name() { return "Thread.print"; }
322 static const char* description() {
323 return "Print all threads with stacktraces.";
324 }
325 static const char* impact() {
326 return "Medium: Depends on the number of threads.";
327 }
328 static const JavaPermission permission() {
329 JavaPermission p = {"java.lang.management.ManagementPermission",
330 "monitor", NULL};
331 return p;
332 }
333 static int num_arguments();
334 virtual void execute(DCmdSource source, TRAPS);
335 };
337 // Enhanced JMX Agent support
339 class JMXStartRemoteDCmd : public DCmdWithParser {
341 // Explicitly list all properties that could be
342 // passed to Agent.startRemoteManagementAgent()
343 // com.sun.management is omitted
345 DCmdArgument<char *> _config_file;
346 DCmdArgument<char *> _jmxremote_host;
347 DCmdArgument<char *> _jmxremote_port;
348 DCmdArgument<char *> _jmxremote_rmi_port;
349 DCmdArgument<char *> _jmxremote_ssl;
350 DCmdArgument<char *> _jmxremote_registry_ssl;
351 DCmdArgument<char *> _jmxremote_authenticate;
352 DCmdArgument<char *> _jmxremote_password_file;
353 DCmdArgument<char *> _jmxremote_access_file;
354 DCmdArgument<char *> _jmxremote_login_config;
355 DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
356 DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
357 DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
358 DCmdArgument<char *> _jmxremote_ssl_config_file;
360 // JDP support
361 // Keep autodiscovery char* not bool to pass true/false
362 // as property value to java level.
363 DCmdArgument<char *> _jmxremote_autodiscovery;
364 DCmdArgument<jlong> _jdp_port;
365 DCmdArgument<char *> _jdp_address;
366 DCmdArgument<char *> _jdp_source_addr;
367 DCmdArgument<jlong> _jdp_ttl;
368 DCmdArgument<jlong> _jdp_pause;
369 DCmdArgument<char *> _jdp_name;
371 public:
372 JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
374 static const char *name() {
375 return "ManagementAgent.start";
376 }
378 static const char *description() {
379 return "Start remote management agent.";
380 }
382 static int num_arguments();
384 virtual void execute(DCmdSource source, TRAPS);
386 };
388 class JMXStartLocalDCmd : public DCmd {
390 // Explicitly request start of local agent,
391 // it will not be started by start dcmd
394 public:
395 JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
397 static const char *name() {
398 return "ManagementAgent.start_local";
399 }
401 static const char *description() {
402 return "Start local management agent.";
403 }
405 virtual void execute(DCmdSource source, TRAPS);
407 };
409 class JMXStopRemoteDCmd : public DCmd {
410 public:
411 JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
412 DCmd(output, heap_allocated) {
413 // Do Nothing
414 }
416 static const char *name() {
417 return "ManagementAgent.stop";
418 }
420 static const char *description() {
421 return "Stop remote management agent.";
422 }
424 virtual void execute(DCmdSource source, TRAPS);
425 };
427 class RotateGCLogDCmd : public DCmd {
428 public:
429 RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
430 static const char* name() { return "GC.rotate_log"; }
431 static const char* description() {
432 return "Force the GC log file to be rotated.";
433 }
434 static const char* impact() { return "Low"; }
435 virtual void execute(DCmdSource source, TRAPS);
436 static int num_arguments() { return 0; }
437 static const JavaPermission permission() {
438 JavaPermission p = {"java.lang.management.ManagementPermission",
439 "control", NULL};
440 return p;
441 }
442 };
444 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP