如何在Java 9中使用线程获取堆栈跟踪?

Java 9添加了StackWalker类,以提供用于访问当前线程堆栈的标准API。在以前的Java版本中,我们可以使用Throwable::getStackTrace,Thread::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

以上是 如何在Java 9中使用线程获取堆栈跟踪? 的全部内容, 来源链接: utcz.com/z/353444.html

回到顶部