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

 

  • 변수 또는 수식 출력하기


'print' 명령어를 사용 합니다.

(gdb) print [변수 또는 수식]


다음 예제 프로그램 은1부터 N 까지의 합을 계산해서 리턴해주는 함수를 호출합니다.

// func_sum.c

#include <stdio.h>

int sum(int value)
{
        int i, sum = 0;

        for(i=0; i<=value; i++)
        {
                sum += i;
        }

        return sum;
}

int main(void)
{
        int a = 10;
        int b = 50;
        int c = 100;

        printf("sum(%d) = %d\n", a, sum(a));
        printf("sum(%d) = %d\n", b, sum(b));
        printf("sum(%d) = %d\n", c, sum(c));

        return 0;
}



gdb로 열어서 list 커맨드로 라인 넘버를 확인 해 봅시다.


브레이크 포인트를 main 함수의 첫번째 라인 (17)에 걸고 run 커맨드를 실행 해 봅시다.

그런데, 10이 출력되지 않고, 이상한 값이 나옵니다.


그 이유는 브레이크 포인트는 17라인에 걸려있는데, 아직 17라인이 실행되지는 않았기 때문입니다.

따라서 next 커맨드를 입력하여, 17라인을 수행하고 나서야 변수 a 에 대한 평가가 가능해 집니다.


마찬가지로 18번째 라인에 브레이크 포인트가 걸려있으므로, b 변수를 확인 하기 위해서는 19번째로 브레이크 포인트를 옮겨야 합니다.


해당 프로그램을 그냥 실행 하게 되면,

소스코드에서 하드 코딩 된 10, 50, 100 의 인자에 대한 함수 호출 결과만 확인 할 수 있습니다.


반면 gdb를 사용하면 중간에 다른 인자를 넣어서 함수 호출이 가능 해 집니다.


  • 변수 값 변경하기

set variable 커맨드를 사용하여, 중간에 변수값을 변경 할 수도 있습니다.

(gdb) set variable 변수=값


a 의 값을 10 에서 30으로 변경 해 보겠습니다.

일단 브레이크 포인트를 18라인으로 잡습니다. (17라인이 실행 된 이후)

그리고 set variable a=30 을 입력하고 print커맨드( 약자 'p') 를 사용하여 a 변수 값을 확인 해 보면 10에서 30으로 변경 되었음을 확인 할 수 있습니다.



  • 출력 포맷 설정하기
(gdb) print [포맷] [변수 또는 수식]


출력 포맷
/xhexadecimal (16진수)
/ooctal (8진수)
/ddecimal (10진수)
/uunsigned decimal (양의 10진수)
/tbinary (2진수)
/ffloat (소수점)
/ccharacter (문자)
/sstring (문자열)
/aaddress (주소)
/iinstruction (어셈블리 명령어)


  • 변수 내용 확인



  • 메모리 내용 확인

주소와 명령어는 메모리를 확인하는 examine 커맨드 (약자 'x') 를 사용합니다.


다음과 같이 프로그램 카운터를 확인 할 수 있습니다.

(gdb) examine $pc


  • 레지스터 값 확인
(gdb) info reg





이 블로그의 인기 게시물

Crusader Kings 3 - Converting DNA code using Portrait Editor