在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()));
这将帮助您打印没有循环的堆栈跟踪。