我如何在Java中获得当前堆栈跟踪,就像在。net中,你可以做environment。stacktrace ?

我找到了Thread.dumpStack(),但这不是我想要的-我想要得到堆栈跟踪,而不是打印出来。


当前回答

StackTraceElement[] st = Thread.currentThread().getStackTrace();

如果你不关心堆栈的第一个元素是什么,那就没问题。

StackTraceElement[] st = new Throwable().getStackTrace();

将有一个定义的位置为您当前的方法,如果这很重要。

其他回答

我有一个实用工具方法,返回一个字符串与stacktrace:

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));
}

要获得所有线程的堆栈跟踪,您可以使用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();

在android上,一个更简单的方法是使用这个:

import android.util.Log;
String stackTrace = Log.getStackTraceString(exception); 

你可以使用Apache的commons:

String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);

你也可以使用异常来打印堆栈,而不是痛苦地输入新的行字符:

Exception e = new Exception();
e.setStackTrace(Thread.currentThread().getStackTrace());
loggr.info(e);