[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 [포맷] [변수 또는 수식]
출력 포맷 | |
/x | hexadecimal (16진수) |
/o | octal (8진수) |
/d | decimal (10진수) |
/u | unsigned decimal (양의 10진수) |
/t | binary (2진수) |
/f | float (소수점) |
/c | character (문자) |
/s | string (문자열) |
/a | address (주소) |
/i | instruction (어셈블리 명령어) |
- 변수 내용 확인
- 메모리 내용 확인
주소와 명령어는 메모리를 확인하는 examine 커맨드 (약자 'x') 를 사용합니다.
다음과 같이 프로그램 카운터를 확인 할 수 있습니다.
(gdb) examine $pc
- 레지스터 값 확인
(gdb) info reg