Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9에서 현재 스레드의 모든 스택 프레임을 표시하는 방법

스택 워킹 API(Stack Walking API)는 호출 스택(call stack)을 순회하며 정보를 추출할 수 있는 유연한 메커니즘을 제공합니다. 이 API를 활용하면 각 프레임을 지연(lazy) 방식으로 필터링하고 접근할 수 있어 불필요한 연산 없이 필요한 정보만 효율적으로 얻을 수 있습니다. StackWalker 클래스는 이 스택 워킹 API의 진입점(entry point) 역할을 담당합니다.

여기서 말하는 스택 트레이스(stack trace)는 특정 시점의 호출 스택에 대한 표현입니다. 각 요소는 하나의 메서드 호출(method invocation)을 나타내며, 스레드가 시작된 시점부터 스택 트레이스가 생성된 시점까지의 모든 호출 내역이 포함됩니다.

아래 예제에서는 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 Helper1 {
    protected static void test1() {
        Helper2.test2();
    }
}

// Helper2 클래스
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());
        }
    }
}

코드 설명

StackWalker.getInstance()를 통해 StackWalker 인스턴스를 얻은 후, walk() 메서드에 스트림 변환 로직을 전달합니다. 위 예제에서는 스택 프레임들을 리스트로 수집(collect)한 뒤 반복문을 돌며 각 프레임의 클래스 이름, 라인 번호, 메서드 이름을 순서대로 출력합니다. 호출 순서상 가장 안쪽(마지막에 호출된) 프레임부터 바깥쪽(main 메서드)까지 표시되는 것을 확인할 수 있습니다.

실행 결과

Helper2 23 test2
Helper1 16 test1
StackWalkerTest 9 main