如何使用 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.