1 /* 2 * Copyright (c) 2015, 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 */ 24 25 package sun.jvm.hotspot; 26 27 import java.util.ArrayList; 28 import java.util.Arrays; 29 30 import sun.jvm.hotspot.tools.JStack; 31 import sun.jvm.hotspot.tools.JMap; 32 import sun.jvm.hotspot.tools.JInfo; 33 import sun.jvm.hotspot.tools.JSnap; 34 35 public class SALauncher { 36 37 private static boolean launcherHelp() { 38 System.out.println(" clhsdb \tcommand line debugger"); 39 System.out.println(" hsdb \tui debugger"); 40 System.out.println(" jstack --help\tto get more information"); 41 System.out.println(" jmap --help\tto get more information"); 42 System.out.println(" jinfo --help\tto get more information"); 43 System.out.println(" jsnap --help\tto get more information"); 44 return false; 45 } 46 47 private static boolean commonHelp() { 48 // --pid <pid> 49 // --exe <exe> 50 // --core <core> 51 System.out.println(" --exe\texecutable image name"); 52 System.out.println(" --core\tpath to coredump"); 53 System.out.println(" --pid\tpid of process to attach"); 54 return false; 55 } 56 57 private static boolean jinfoHelp() { 58 // --flags -> -flags 59 // --sysprops -> -sysprops 60 System.out.println(" --flags\tto print VM flags"); 61 System.out.println(" --sysprops\tto print Java System properties"); 62 System.out.println(" <no option>\tto print both of the above"); 63 return commonHelp(); 64 } 65 66 private static boolean jmapHelp() { 67 // --heap -> -heap 68 // --binaryheap -> -heap:format=b 69 // --histo -> -histo 70 // --clstats -> -clstats 71 // --finalizerinfo -> -finalizerinfo 72 73 System.out.println(" <no option>\tto print same info as Solaris pmap"); 74 System.out.println(" --heap\tto print java heap summary"); 75 System.out.println(" --binaryheap\tto dump java heap in hprof binary format"); 76 System.out.println(" --histo\tto print histogram of java object heap"); 77 System.out.println(" --clstats\tto print class loader statistics"); 78 System.out.println(" --finalizerinfo\tto print information on objects awaiting finalization"); 79 return commonHelp(); 80 } 81 82 private static boolean jstackHelp() { 83 // --locks -> -l 84 // --mixed -> -m 85 System.out.println(" --locks\tto print java.util.concurrent locks"); 86 System.out.println(" --mixed\tto print both java and native frames (mixed mode)"); 87 return commonHelp(); 88 } 89 90 private static boolean jsnapHelp() { 91 System.out.println(" <no option>\tdump perfromance counters"); 92 return commonHelp(); 93 } 94 95 private static boolean toolHelp(String toolName) { 96 if (toolName.equals("jstack")) { 97 return jstackHelp(); 98 } 99 if (toolName.equals("jinfo")) { 100 return jinfoHelp(); 101 } 102 if (toolName.equals("jmap")) { 103 return jmapHelp(); 104 } 105 if (toolName.equals("jsnap")) { 106 return jsnapHelp(); 107 } 108 if (toolName.equals("hsdb") || toolName.equals("clhsdb")) { 109 return commonHelp(); 110 } 111 return launcherHelp(); 112 } 113 114 private static void runCLHSDB(String[] oldArgs) { 115 SAGetopt sg = new SAGetopt(oldArgs); 116 String[] longOpts = {"exe=", "core=", "pid="}; 117 118 ArrayList<String> newArgs = new ArrayList(); 119 String exeORpid = null; 120 String core = null; 121 String s = null; 122 123 while((s = sg.next(null, longOpts)) != null) { 124 if (s.equals("exe")) { 125 exeORpid = sg.getOptarg(); 126 continue; 127 } 128 if (s.equals("core")) { 129 core = sg.getOptarg(); 130 continue; 131 } 132 if (s.equals("pid")) { 133 exeORpid = sg.getOptarg(); 134 continue; 135 } 136 } 137 138 if (exeORpid != null) { 139 newArgs.add(exeORpid); 140 if (core != null) { 141 newArgs.add(core); 142 } 143 } 144 CLHSDB.main(newArgs.toArray(new String[newArgs.size()])); 145 } 146 147 private static void runHSDB(String[] oldArgs) { 148 SAGetopt sg = new SAGetopt(oldArgs); 149 String[] longOpts = {"exe=", "core=", "pid="}; 150 151 ArrayList<String> newArgs = new ArrayList(); 152 String exeORpid = null; 153 String core = null; 154 String s = null; 155 156 while((s = sg.next(null, longOpts)) != null) { 157 if (s.equals("exe")) { 158 exeORpid = sg.getOptarg(); 159 continue; 160 } 161 if (s.equals("core")) { 162 core = sg.getOptarg(); 163 continue; 164 } 165 if (s.equals("pid")) { 166 exeORpid = sg.getOptarg(); 167 continue; 168 } 169 } 170 171 if (exeORpid != null) { 172 newArgs.add(exeORpid); 173 if (core != null) { 174 newArgs.add(core); 175 } 176 } 177 HSDB.main(newArgs.toArray(new String[newArgs.size()])); 178 } 179 180 private static void runJSTACK(String[] oldArgs) { 181 SAGetopt sg = new SAGetopt(oldArgs); 182 String[] longOpts = {"exe=", "core=", "pid=", 183 "mixed", "locks"}; 184 185 ArrayList<String> newArgs = new ArrayList(); 186 String exeORpid = null; 187 String core = null; 188 String s = null; 189 190 while((s = sg.next(null, longOpts)) != null) { 191 if (s.equals("exe")) { 192 exeORpid = sg.getOptarg(); 193 continue; 194 } 195 if (s.equals("core")) { 196 core = sg.getOptarg(); 197 continue; 198 } 199 if (s.equals("pid")) { 200 exeORpid = sg.getOptarg(); 201 continue; 202 } 203 if (s.equals("mixed")) { 204 newArgs.add("-m"); 205 continue; 206 } 207 if (s.equals("locks")) { 208 newArgs.add("-l"); 209 continue; 210 } 211 } 212 213 if (exeORpid != null) { 214 newArgs.add(exeORpid); 215 if (core != null) { 216 newArgs.add(core); 217 } 218 } 219 220 JStack.main(newArgs.toArray(new String[newArgs.size()])); 221 } 222 223 private static void runJMAP(String[] oldArgs) { 224 SAGetopt sg = new SAGetopt(oldArgs); 225 String[] longOpts = {"exe=", "core=", "pid=", 226 "heap", "binaryheap", "histo", "clstats", "finalizerinfo"}; 227 228 ArrayList<String> newArgs = new ArrayList(); 229 String exeORpid = null; 230 String core = null; 231 String s = null; 232 233 while((s = sg.next(null, longOpts)) != null) { 234 if (s.equals("exe")) { 235 exeORpid = sg.getOptarg(); 236 continue; 237 } 238 if (s.equals("core")) { 239 core = sg.getOptarg(); 240 continue; 241 } 242 if (s.equals("pid")) { 243 exeORpid = sg.getOptarg(); 244 continue; 245 } 246 if (s.equals("heap")) { 247 newArgs.add("-heap"); 248 continue; 249 } 250 if (s.equals("binaryheap")) { 251 newArgs.add("-heap:format=b"); 252 continue; 253 } 254 if (s.equals("histo")) { 255 newArgs.add("-histo"); 256 continue; 257 } 258 if (s.equals("clstats")) { 259 newArgs.add("-clstats"); 260 continue; 261 } 262 if (s.equals("finalizerinfo")) { 263 newArgs.add("-finalizerinfo"); 264 continue; 265 } 266 } 267 268 if (exeORpid != null) { 269 newArgs.add(exeORpid); 270 if (core != null) { 271 newArgs.add(core); 272 } 273 } 274 275 JMap.main(newArgs.toArray(new String[newArgs.size()])); 276 } 277 278 private static void runJINFO(String[] oldArgs) { 279 SAGetopt sg = new SAGetopt(oldArgs); 280 String[] longOpts = {"exe=", "core=", "pid=", 281 "flags", "sysprops"}; 282 283 ArrayList<String> newArgs = new ArrayList(); 284 String exeORpid = null; 285 String core = null; 286 String s = null; 287 288 while((s = sg.next(null, longOpts)) != null) { 289 if (s.equals("exe")) { 290 exeORpid = sg.getOptarg(); 291 continue; 292 } 293 if (s.equals("core")) { 294 core = sg.getOptarg(); 295 continue; 296 } 297 if (s.equals("pid")) { 298 exeORpid = sg.getOptarg(); 299 continue; 300 } 301 if (s.equals("flags")) { 302 newArgs.add("-flags"); 303 continue; 304 } 305 if (s.equals("sysprops")) { 306 newArgs.add("-sysprops"); 307 continue; 308 } 309 } 310 311 if (exeORpid != null) { 312 newArgs.add(exeORpid); 313 if (core != null) { 314 newArgs.add(core); 315 } 316 } 317 318 JInfo.main(newArgs.toArray(new String[newArgs.size()])); 319 } 320 321 private static void runJSNAP(String[] oldArgs) { 322 SAGetopt sg = new SAGetopt(oldArgs); 323 String[] longOpts = {"exe=", "core=", "pid="}; 324 325 ArrayList<String> newArgs = new ArrayList(); 326 String exeORpid = null; 327 String core = null; 328 String s = null; 329 330 while((s = sg.next(null, longOpts)) != null) { 331 if (s.equals("exe")) { 332 exeORpid = sg.getOptarg(); 333 continue; 334 } 335 if (s.equals("core")) { 336 core = sg.getOptarg(); 337 continue; 338 } 339 if (s.equals("pid")) { 340 exeORpid = sg.getOptarg(); 341 continue; 342 } 343 } 344 345 if (exeORpid != null) { 346 newArgs.add(exeORpid); 347 if (core != null) { 348 newArgs.add(core); 349 } 350 } 351 352 JSnap.main(newArgs.toArray(new String[newArgs.size()])); 353 } 354 355 public static void main(String[] args) { 356 // Provide a help 357 if (args.length == 0) { 358 launcherHelp(); 359 return; 360 } 361 // No arguments imply help for jstack, jmap, jinfo but launch clhsdb and hsdb 362 if (args.length == 1 && !args[0].equals("clhsdb") && !args[0].equals("hsdb")) { 363 toolHelp(args[0]); 364 return; 365 } 366 367 for (String arg : args) { 368 if (arg.equals("-h") || arg.equals("-help") || arg.equals("--help")) { 369 toolHelp(args[0]); 370 return; 371 } 372 } 373 374 String[] oldArgs = Arrays.copyOfRange(args, 1, args.length); 375 376 // Run SA interactive mode 377 if (args[0].equals("clhsdb")) { 378 runCLHSDB(oldArgs); 379 return; 380 } 381 382 if (args[0].equals("hsdb")) { 383 runHSDB(oldArgs); 384 return; 385 } 386 387 // Run SA tmtools mode 388 if (args[0].equals("jstack")) { 389 runJSTACK(oldArgs); 390 return; 391 } 392 393 if (args[0].equals("jmap")) { 394 runJMAP(oldArgs); 395 return; 396 } 397 398 if (args[0].equals("jinfo")) { 399 runJINFO(oldArgs); 400 return; 401 } 402 403 if (args[0].equals("jsnap")) { 404 runJSNAP(oldArgs); 405 return; 406 } 407 } 408 }