在Java中获取当前堆栈跟踪
如何获得Java中的当前堆栈跟踪,就像在.NET中可以执行Environment.StackTrace ? 
 顺便说一句, Thread.dumpStack()是不是我想要的 – 我想获得堆栈追溯 ,而不是打印出来。 
 你可以使用Thread .currentThread().getStackTrace() 。 
 这将返回一个StackTraceElement数组,它表示程序的当前堆栈跟踪。 
 Thread.currentThread().getStackTrace(); 
如果你不关心堆栈的第一个元素是什么,那就好了。
 new Throwable().getStackTrace(); 
将有一个明确的立场为您目前的方法,如果有关系。
 for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { System.out.println(ste); } 
 Thread.currentThread().getStackTrace(); 
从JDK1.5开始可用。
 对于较早的版本,可以将exception.printStackTrace()redirect到StringWriter() : 
 StringWriter sw = new StringWriter(); new Throwable("").printStackTrace(new PrintWriter(sw)); String stackTrace = sw.toString(); 
你可以使用Apache的commons:
 String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e); 
在Android上更简单的方法是使用这个:
 import android.util.Log; String stackTrace = Log.getStackTraceString(exception); 
要获取所有线程的堆栈跟踪,可以使用jstack实用程序JConsole或发送kill -quit信号(在Posix操作系统上)。
但是,如果您想以编程方式执行此操作,则可以尝试使用ThreadMXBean:
 ThreadMXBean bean = ManagementFactory.getThreadMXBean(); ThreadInfo[] infos = bean.dumpAllThreads(true, true); for (ThreadInfo info : infos) { StackTraceElement[] elems = info.getStackTrace(); // Print out elements, etc. } 
 如上所述,如果你只想要当前线程的堆栈跟踪,那就简单多了 – 只要使用Thread.currentThread().getStackTrace() ; 
 另一个解决scheme(只有35 31个字符): 
 new Exception().printStackTrace(); new Error().printStackTrace(); 
 傻我,这是Thread.currentThread().getStackTrace(); 
我有一个实用的方法,返回一个string与堆栈跟踪:
 static String getStackTrace(Throwable t) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true); t.printStackTrace(pw); pw.flush(); sw.flush(); return sw.toString(); } 
而只是像…
 ... catch (FileNotFoundException e) { logger.config(getStackTrace(e)); } 
用番石榴串:
 Throwables.getStackTraceAsString(new Throwable()) 
 try { } catch(Exception e) { StackTraceElement[] traceElements = e.getStackTrace(); //... } 
要么
 Thread.currentThread().getStackTrace() 
托尼,作为接受的答案的评论,给了什么似乎是最好的答案,实际上回答OP的问题 :
 Arrays.toString(Thread.currentThread().getStackTrace()); 
  OP没有询问如何从Exception的堆栈跟踪中获取String 。 尽pipe我是Apache Commons的忠实拥趸,但是当上面有这么简单的东西时,就没有理由使用外部库了。 
也许你可以试试这个:
 catch(Exception e) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); e.printStackTrace(pw); String errorDetail = writer.toString(); } 
string“errorDetail”包含堆栈跟踪。
 StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。
 A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName(). 
通过StackTraceElement循环,并得到您想要的结果。
 for (StackTraceElement ste : stackTraceElements ) { //do your stuff here... } 
我build议
  Thread.dumpStack() 
是一个更简单的方法,并且有一个好处,就是在没有任何问题的情况下,实际上不会构造一个exception或抛出,而且更重要。
在Java 9中有一个新的方法:
 public static void showTrace() { List<StackFrame> frames = StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE ) .walk( stream -> stream.collect( Collectors.toList() ) ); for ( StackFrame stackFrame : frames ) System.out.println( stackFrame ); } 
如果你想检查你的进程的当前调用堆栈,你可以使用jstack实用程序。
 Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message 
我使用上面的答案和添加格式
 public final class DebugUtil { private static final String SEPARATOR = "\n"; private DebugUtil() { } public static String formatStackTrace(StackTraceElement[] stackTrace) { StringBuilder buffer = new StringBuilder(); for (StackTraceElement element : stackTrace) { buffer.append(element).append(SEPARATOR); } return buffer.toString(); } public static String formatCurrentStacktrace() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); return formatStackTrace(stackTrace); } } 
这是一个旧的post,但这里是我的解决scheme:
 Thread.currentThread().dumpStack(); 
更多信息和更多的方法在那里: http : //javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
 System.out.println(Arrays.toString(Thread.currentThread().getStackTrace())); 
这将帮助您打印没有循环的堆栈跟踪。