在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()));

这将帮助您打印没有循环的堆栈跟踪。