如何使用 Java 9 线程获得堆栈跟踪?


Java 9 已添加 StackWalker 类,以提供访问当前线程堆栈的标准 API。在以前的 Java 版本中,我们可以使用Throwable::getStackTraceThread::getStackTrace SecurityManager:: GetClassContext提供的获得线程堆栈的方法。

Thread.getStackTrace() 方法将返回一个表示线程栈转储的栈跟踪元素数组(StackTraceElement[])。数组的第一个元素表示棧顶,它可以是序列中的最后一个方法调用,数组的最后一个元素表示棧底,它可以是序列中的第一个方法调用。

语法

public StackTraceElement[] getStackTrace()

示例

import java.lang.StackWalker.Option;

public class GetStackTraceTest {
   public static void main(String args[]) {
      GetStackTraceTest.testPrintCurrnentStackTrace();
      GetStackTraceTest.testShowReflectFrames();
   }
   // get StackTrace using Thread
   public static void testPrintCurrnentStackTrace() {
      StackTraceElement[] stack = Thread.currentThread().getStackTrace();
      for(StackTraceElement element : stack) {
         System.out.println(element);
      }
   }
   // SHOW_REFLECT_FRAMES
   public static void print(StackWalker stackWalker) {
      stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n",
stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName()));
   }

   public static void testShowReflectFrames() {
      final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES);
      print(stackWalker);
   }
}

输出

java.base/java.lang.Thread.getStackTrace(Thread.java:1654)
GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10)
GetStackTraceTest.main(GetStackTraceTest.java:5)
   17| GetStackTraceTest -> print
   25| GetStackTraceTest -> testShowReflectFrames
   6| GetStackTraceTest -> main

更新于: 2020-04-23

407 次浏览

开启你的 职业

完成课程即可获得认证

开始
广告
© . All rights reserved.