콜스택(Call Stack)이란? Stack Trace 확인하기

흔히 애플리케이션에 문제가 있을 때 "에러 로그를 본다"고 하는데, 이때 로그에 ERROR 메시지와 함께 at~ at~형태로 쭉 이어지는 정보들을 스택 트레이스(stack trace)라고 부릅니다. 스택 트레이스는 콜스택의 저장된 함수 호출 정보를 출력한 데이터입니다.

콜스택이란?

콜스택(call stack)은 컴퓨터 프로그램에서 함수 호출과 관련된 실행 컨텍스트를 관리하는 데이터 구조입니다. 함수 호출과 반환, 변수 저장을 추적하는 데 사용되며 프로그램 실행 중에 발생하는 함수 호출에 대한 정보를 저장합니다.

 

콜스택이 작동하는 방식은 다음과 같습니다.

 

1. 함수 호출 시 호출한 함수에 대한 정보(반환 주소, 함수 인수, 지역 변수 등)를 스택 프레임이라고 부르는 단위로 콜스택에 저장(push)합니다.

 

2. 함수가 실행을 완료하고 반환할 때 해당 함수의 스택 프레임을 콜스택에서 제거(pop)하고 반환 주소를 사용해서 호출자 함수로 돌아갑니다.

 

콜스택이 필요한 이유

콜스택은 디버깅 과정에서 스택 트레이스를 통해 문제의 원인을 파악하고 해결하는 데 필요합니다.

 

예를 들어, 재귀 함수 호출로 스택 오버플로우가 발생하는 예제를 보겠습니다.

#include <stdio.h>

void recursive_function(int count) {
    printf("Call count: %d\n", count);
    recursive_function(count + 1);
}

int main() {
    recursive_function(1);
    return 0;
}

 

이 프로그램을 실행하면 재귀 함수 호출이 무한이 이루어져 결국 스택 오버플로우가 발생합니다. 그러면 프로그램이 비정상적으로 종료되고 시스템에서 아래와 같은 콜스택이 생성될 수 있습니다. main 함수에서 recursive_function이 호출되고 recursive_function에서 반복적으로 재귀 호출을 하는 걸 확인할 수 있습니다.

Call count: 268435452
Stack overflow in thread "main"
  at recursive_function (example.c:6)
  at recursive_function (example.c:7)
  at recursive_function (example.c:7)
  ...
  at recursive_function (example.c:7)
  at main (example.c:12)

 

실제 응용 프로그램에서의 콜스택은 이렇게 간단하진 않지만 콜스택을 통해 프로그램의 실행 흐름과 문제를 파악한다는 원리는 동일합니다.

반응형

댓글

Designed by JB FACTORY