Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java 9에서 스레드를 사용하여 스택 추적을 얻는 방법은 무엇입니까?

<시간/>

자바 9 StackWalker 를 추가했습니다. 현재 스레드 스택에 액세스하기 위한 표준 API를 제공하는 클래스입니다. 이전 자바 버전에서는 Throwable::getStackTrace를 사용할 수 있습니다. , 스레드::getStackTraceSecurityManager::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