如何获取Java中的当前堆栈的跟踪信息 | Java Debug 笔记

如何获取Java中的当前堆栈的跟踪信息 | Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:

我如何在Java中获取当前的堆栈跟踪信息,正如我在.NET中执行Environment.StackTrace那样?

我找到了Thread.dumpStack方法,但这不是我想要的——我想获取堆栈跟踪信息,而不是打印出来。

回答1:

您可以使用Thread.currentThread().getStackTrace()

这将返回一个StackTraceElements数组,这些数组代表程序的当前堆栈跟踪信息。

回答2:

Thread.currentThread().getStackTrace();
复制代码

如果您不在乎堆栈的第一个元素,那么上述方法正是你想要的。

new Throwable().getStackTrace();
复制代码

如果需要定位当前线程位置,请使用以上方法。

回答3:

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}
复制代码

回答4:

Thread.currentThread().getStackTrace();
复制代码

上述方法从JDK1.5开始可用。

对于较旧的版本,可以将exception.printStackTrace()重定向到StringWriter()

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
复制代码

回答5:

你可以使用Apache's commons的库:

String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
复制代码

回答6:

作为对已接受答案的评论(即第一个回答里面有个评论,原文是:A one liner to convert the stack trace to a string that works when you don’t have an exception and you aren’t using Apache Arrays.toString(Thread.currentThread().getStackTrace()) – Tony ),Tony给出了实际上是回答楼主问题的最佳答案:

Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );
复制代码

楼主并没有询问如何从异常中的堆栈跟踪中获取字符串。尽管我是Apache Commons库的忠实拥护者,但是当事情像上面一样简单时,没有逻辑上的理由使用外部库。

(此层评论指出应该将getStackTrace()改为getAllStackTrace()以便打印全部堆栈信息,评论如下:在这种情况下,请确保使用Thread.getAllStackTraces(),它为您提供了Map<Thread,StackTraceElement[]>Hotspot将在需要安全指向一个线程时对所有线程建立安全点。 Zing可以将各个线程带到一个安全点,而不会干扰其他线程。获取stacktrace需要一个安全点。 Thread.getAllStackTraces()获取所有堆栈跟踪,并仅停止所有线程一次。当然,您必须找出您实际上对哪个堆栈信息感兴趣。)

原文链接

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享