[java] 스택을 이용한 콜 스택 추적하기
콜 스택 추적은 디버깅 프로세스 중에 매우 유용한 도구입니다. 스택 추적을 통해 현재 실행 중인 함수 호출의 순서와 상위 호출 함수들을 파악할 수 있습니다. 자바에서는 스택을 이용하여 콜 스택을 추적할 수 있습니다.
스택 추적 방법
Thread.currentThread().getStackTrace()
메서드를 호출하여 현재 실행 스레드의 스택 트레이스를 가져옵니다.- 스택 트레이스에서 각 요소는 호출된 메서드를 나타내며, 메서드 이름, 파일 이름, 라인 번호 등의 정보를 포함합니다.
- 필요한 정보를 추출하여 원하는 형식으로 출력합니다.
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()
메서드가 제공되어 스택 트레이스 정보를 가져올 수 있습니다. 스택 추적은 디버깅, 예외 처리 및 성능 분석 등 다양한 상황에서 유용하게 사용될 수 있습니다.