如何在 Java 9 中顯示當前執行緒的所有堆疊幀?


堆疊遍歷 API可以提供一種靈活的機制來遍歷和從呼叫堆疊中提取資訊,使我們能夠以惰性方式篩選和訪問幀。StackWalker 類是 Stack Walking API 的入口點。堆疊軌跡是在某一時間點上對呼叫堆疊的表示,其中每個元素表示一個方法呼叫。它包含從執行緒開始到生成它的那一點的所有呼叫。

在以下示例中,我們可以使用 StackWalker API 輸出/顯示當前執行緒的所有堆疊幀。

示例

import java.lang.StackWalker.StackFrame;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;

public class StackWalkerTest {
   public static void main(String args[]) throws Exception {
      Method test1Method = Helper1.class.getDeclaredMethod("test1", (Class[])null);
      test1Method.invoke(null, (Object[]) null);
   }
}

// Helper1 class
class Helper1 {
   protected static void test1() {
      Helper2.test2();
   }
}

// Helper2 class
class Helper2 {
   protected static void test2() {
      List<StackFrame> stack = StackWalker.getInstance().walk((s) -> s.collect(Collectors.toList()));
      for(StackFrame frame : stack) {
         System.out.println(frame.getClassName() + " " + frame.getLineNumber() + " " +    frame.getMethodName());
      }
   }
}

輸出

Helper2 23 test2
Helper1 16 test1
StackWalkerTest 9 main

更新於:19-3-2020

311 次瀏覽

開啟你的事業

完成課程即可獲得認證

開始學習
廣告
© . All rights reserved.