1 /* 2 * Copyright (c) 2002, 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 */ 24 25 package sun.jvm.hotspot.tools; 26 27 import sun.jvm.hotspot.debugger.*; 28 import sun.jvm.hotspot.runtime.*; 29 import sun.jvm.hotspot.oops.*; 30 31 /** Traverses and prints the stack traces for all Java threads in the 32 * remote VM */ 33 public class StackTrace extends Tool { 34 // in non-verbose mode pc, sp and Method* are not printed 35 public StackTrace(boolean v, boolean concurrentLocks) { 36 this.verbose = v; 37 this.concurrentLocks = concurrentLocks; 38 } 39 40 public StackTrace() { 41 this(true, true); 42 } 43 44 public void run() { 45 run(System.out); 46 } 47 48 public StackTrace(JVMDebugger d) { 49 super(d); 50 } 51 52 public StackTrace(JVMDebugger d, boolean v, boolean concurrentLocks) { 53 super(d); 54 this.verbose = v; 55 this.concurrentLocks = concurrentLocks; 56 } 57 58 public void run(java.io.PrintStream tty) { 59 // Ready to go with the database... 60 try { 61 // print deadlock information before stack trace 62 DeadlockDetector.print(tty); 63 } catch (Exception exp) { 64 exp.printStackTrace(); 65 tty.println("Can't print deadlocks:" + exp.getMessage()); 66 } 67 68 try { 69 ConcurrentLocksPrinter concLocksPrinter = null; 70 if (concurrentLocks) { 71 concLocksPrinter = new ConcurrentLocksPrinter(); 72 } 73 Threads threads = VM.getVM().getThreads(); 74 int i = 1; 75 for (JavaThread cur = threads.first(); cur != null; cur = cur.next(), i++) { 76 if (cur.isJavaThread()) { 77 cur.printThreadInfoOn(tty); 78 try { 79 int count = 0; 80 81 for (JavaVFrame vf = cur.getLastJavaVFrameDbg(); vf != null; vf = vf.javaSender()) { 82 Method method = vf.getMethod(); 83 tty.print(" - " + method.externalNameAndSignature() + 84 " @bci=" + vf.getBCI()); 85 86 int lineNumber = method.getLineNumberFromBCI(vf.getBCI()); 87 if (lineNumber != -1) { 88 tty.print(", line=" + lineNumber); 89 } 90 91 if (verbose) { 92 Address pc = vf.getFrame().getPC(); 93 if (pc != null) { 94 tty.print(", pc=" + pc); 95 } 96 97 tty.print(", Method*=" + method.getAddress()); 98 } 99 100 if (vf.isCompiledFrame()) { 101 tty.print(" (Compiled frame"); 102 if (vf.isDeoptimized()) { 103 tty.print(" [deoptimized]"); 104 } 105 } 106 if (vf.isInterpretedFrame()) { 107 tty.print(" (Interpreted frame"); 108 } 109 if (vf.mayBeImpreciseDbg()) { 110 tty.print("; information may be imprecise"); 111 } 112 113 tty.println(")"); 114 vf.printLockInfo(tty, count++); 115 } 116 } catch (Exception e) { 117 tty.println("Error occurred during stack walking:"); 118 e.printStackTrace(); 119 } 120 tty.println(); 121 if (concurrentLocks) { 122 concLocksPrinter.print(cur, tty); 123 } 124 tty.println(); 125 } 126 } 127 } 128 catch (AddressException e) { 129 System.err.println("Error accessing address 0x" + Long.toHexString(e.getAddress())); 130 e.printStackTrace(); 131 } 132 } 133 134 public static void main(String[] args) { 135 StackTrace st = new StackTrace(); 136 st.execute(args); 137 } 138 139 private boolean verbose; 140 private boolean concurrentLocks; 141 }