[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에는 접근이 불가능 하게 됩니다.
