[Linux] GDB (GNU Debugger) 사용하기 - 7

 

  • 스코프 변경하기

다음 코드에서는 Depth 가 2인 함수 호출을 하게 됩니다.

main( ) → func1( ) → func2( )

// frame.c
#include <stdio.h>

void func2()
{
        int b = 30;

        printf("func2\n");
}

void func1()
{
        int a = 20;

        printf("func1\n");

        func2();
}

int main()
{
        int n = 100;

        printf("Start\n");

        printf("[main] n = %d\n", n);

        func1();

        printf("End\n");

        return 0;
}


각 스코프에서는 접근 가능한 지역 변수를 확인 할 수 있습니다.


Break Point를 라인넘버 7에 걸고 run 커맨드로 실행 후, backtrace 커맨드로 스택 프레임을 확인 해보겠습니다.

그러면 왼쪽에 스택 프레임 넘버가 나오게 됩니다.


지금 위치한 프레임은 함수 func2( ) 스코프 이므로, 변수 b 만 확인 할 수 있습니다.

하지만, frame 커맨드 (약자 'f') 를 사용하면 스택프레임번호에 맞는 스코프에 포커싱 하여 상위 호출단의 지역변수에 접근이 가능합니다.

(gdb) frame [스택프레임번호]


frame 1을 입력하여 스코프를 함수 func1( ) 으로 포커싱 시킬 수 있습니다. 그러면 변수 a에 접근이 가능해 집니다.

포커싱이 func1( )에 되어있기 때문에, b 변수에는 접근 할 수 없게 됩니다.


frame 2를 입력하게 되면 main( ) 함수로 포커싱 됩니다.

그러면 변수 n에는 접근 가능하나 func1 과 func2의 지역변수 a와 b에는 접근이 불가능 하게 됩니다.

이 블로그의 인기 게시물

Crusader Kings 3 - Converting DNA code using Portrait Editor