[java] 스택을 이용한 콜 스택 추적하기

콜 스택 추적은 디버깅 프로세스 중에 매우 유용한 도구입니다. 스택 추적을 통해 현재 실행 중인 함수 호출의 순서와 상위 호출 함수들을 파악할 수 있습니다. 자바에서는 스택을 이용하여 콜 스택을 추적할 수 있습니다.

스택 추적 방법

  1. Thread.currentThread().getStackTrace() 메서드를 호출하여 현재 실행 스레드의 스택 트레이스를 가져옵니다.
  2. 스택 트레이스에서 각 요소는 호출된 메서드를 나타내며, 메서드 이름, 파일 이름, 라인 번호 등의 정보를 포함합니다.
  3. 필요한 정보를 추출하여 원하는 형식으로 출력합니다.
public class CallStackTracer {

    public static void main(String[] args) {
        foo();
    }

    public static void foo() {
        bar();
    }

    public static void bar() {
        printStackTrace();
    }

    public static void printStackTrace() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement element : stackTrace) {
            System.out.println(element);
        }
    }

}

위의 예제 코드에서는 Thread.currentThread().getStackTrace() 메서드를 이용하여 현재 스레드의 스택 트레이스를 출력합니다. main 메서드에서 foo 메서드를 호출하고, foo 메서드에서 bar 메서드를 호출한 후에 printStackTrace 메서드가 호출됩니다. printStackTrace 메서드에서는 스택 트레이스의 각 요소를 반복하여 출력하게 됩니다.

실행 결과

java.lang.Thread.getStackTrace(Unknown Source)
com.example.CallStackTracer.printStackTrace(CallStackTracer.java:20)
com.example.CallStackTracer.bar(CallStackTracer.java:15)
com.example.CallStackTracer.foo(CallStackTracer.java:10)
com.example.CallStackTracer.main(CallStackTracer.java:6)

출력 결과에서는 가장 최상위에 있는 메서드부터 차례로 출력되며, 각 요소에는 메서드의 이름과 위치 정보가 포함되어 있음을 확인할 수 있습니다.

Java 1.4 버전 이후부터는 Thread.getStackTrace() 메서드가 제공되어 스택 트레이스 정보를 가져올 수 있습니다. 스택 추적은 디버깅, 예외 처리 및 성능 분석 등 다양한 상황에서 유용하게 사용될 수 있습니다.

참고 자료