Skip to content

Stack trace

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

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

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

#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void handler(int sig)
{
    void *array[10];
    size_t size;

    // get void*'s for all entries on the stack
    size = backtrace(array, 10);

    // print out all the frames to stderr
    fprintf(stderr, "Error: signal %d:\n", sig);
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}

void baz()
{
    int *foo = (int*) -1; // make a bad pointer
    printf("%d\n", *foo);       // causes segfault
}

void bar()
{
    baz();
}
void foo()
{
    bar();
}

int main(int argc, char **argv)
{
    signal(SIGSEGV, handler);   // install our handler
    foo(); // this will call foo, bar, and baz.  baz segfaults.
}

Compiling with -g -rdynamic gets you symbol info in your output, which glibc can use to make a nice stacktrace:

$ gcc -g -rdynamic ./test.c -o test

Python gdb debugging

Gdb#Python gdb debugging 항목 참조.

Libraries

See also

Favorite site

Simple project

Guide