스택 추적

프로그램 실행 중 특정한 시점에서의 스택 프레임에 대한 리포트

스택 추적 (stack trace, stack backtrace[1] 또는 stack traceback[2])은 프로그램 실행 중 특정한 시점에서의 스택 프레임에 대한 리포트이다. 프로그램 실행 중 메모리는 보통 두 곳에 동적으로 할당되는데, 스택과 힙이 그것이다. 메모리는 이름에서 보이듯이 스택에서는 인접하여 할당되지만 힙은 그렇지 않다. 스택은 또한 프로그래밍 구조로도 여겨지며 프로그램의 런타임 스택으로 불린다. 기술적으로 메모리 블록이 스택에 할당되면, 이것은 그 이전에 할당된 블록같이 쉽게 제거되지 않는다. 프로그램에서 함수가 호출될 때마다 메모리 블록은 활성 레코드 (activation record)라고 불리는 런타임 스택의 위에 할당된다. 높은 수준에서는, 활성 레코드가 함수의 파라미터와 내부에 선언된 지역변수를 위해서 메모리를 할당한다.

프로그래머들은 보통 상호적인 사후 분석 디버깅에서 스택 추적을 사용한다. 최종 사용자들은 화면의 오류 메시지를 통해 스택 추적을 보게 되며 이것을 보고 프로그래머에게 리포트를 보낼 수 있다.

스택 추적은 호출된 중첩 함수의 순서를 스택 추적이 생성된 지점까지 추적할 수 있게 한다. 사후 분석 시나리오에서 이것은 실패가 발생한 함수까지 확장된다. 형재 함수 호출은 스택 추적에서 볼 수 없다.

예를 들면, 아래의 파이썬은 에러를 포함한다.

  def a():
      i = 0
      j = b(i)
      return j

  def b(z):
      k = 5
      if z == 0:
          c()
      return k/z

  def c():
      error()

  a()

표준 파이썬 인터프리터 하에서 프로그램을 실행하면 아래의 에러 메시지가 생성된다. 

 Traceback (most recent call last):
   File "tb.py", line 15, in <module>
     a()
   File "tb.py", line 3, in a
     b()
   File "tb.py", line 9, in b
     c()
   File "tb.py", line 13, in c
     error()
 NameError: global name 'error' is not defined

스택 추적은 어디서 에러가 발생했는지를 보여준다. 또한 c 함수가 b에 의해서 호출됐다는 것도 보여준다. 이 세 함수들을 위한 각각의 활성 레코드는 스택에 정렬된다.  a 함수가 스택의 바닥을 차지하고, c 함수는 스택의 맨 위로 차지한다.|

언어 지원 편집

많은 프로그래밍 언어 (자바와 C#을 포함한)는 시스템 호출을 통해 현재 스택 추적을 검색하는 빌트인된 지원을 갖는다. C++은 이것에 대한 빌트인 지원은 없지만, C++ 사용자들은 stacktrace 라이브러리를 통해 스택 추적을 검색할 수 있다. 자바스크립트에서는 예외 처리는 thrown이 발생한 스택을 포함하는 stack 속성을 갖는다.

같이 보기 편집

각주 편집

  1. “libc manual: backtraces”. gnu.org. 2014년 7월 8일에 확인함. 
  2. “traceback — Print or retrieve a stack traceback”. python.org. 2014년 7월 8일에 확인함.