Linux gdb 디버거

Featured image

gdb 디버거

유닉스/리눅스 시스템에서 프로그램을 디버깅하기 위한 가장 대표적인 디버거로 GNU 디버거 gdb가 있다. gdb는 다양한 유닉스 기반의 시스템에서 동작하는 이식성 있는 디버거로, Ada, C, C++, 포트란 등의 여러 프로그래밍 언어를 지원한다. gdb는 1988년 리처드 스톨만이 처음 작성한 것으로 , 무료로 사용할 수 있는 자유 소프트웨어이다.

gdb 사용

$ gcc -g -o long long.c

$ gcc -g -o main main.c copy.c

$ gdb [실행파일]
gdb 디버거는 실행파일을 이용하여 디버깅 모드로 실행한다.

gdb 기능

gdb의 기본 기능은 소스 보기, 정지점 설정, 프로그램 수행, 변수 값 프린트 등으로 구분할 수 있다.

gdb를 이용한 디버깅

gdb를 이용하여 main 프로그램을 실행시킨 후에 copy 함수에 정지하여 실행 과정을 추적해보자.

$ gdb main
GNU gdb (GDB) Red Hat Enterprise 리눅스 (11.1-29.e16)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3++: GNU GPL version 3 or later
http://gnu.org/licenses/gpl.html

Reading symbols from /home/~/바탕화면/src/long…done.

먼저 l(ist) 명령어를 이용하여 copy 함수를 리스트해보자.

(gdb) l copy
1   #include <stdio.h>
2   
3   /* copy: copy 'from' into 'to'; assume to is big enough */
4   void copy(char from[], char to[])
5   {
6      int i;
7
8      i = 0;
9      while ((to[i] = from[i]) != '\0')
10         ++i;
11  }

(gdb) b copy
Breakpoint 1 at 0x804842a: file copy.c, line 9.

(gdb) info b 
Num Type    Disp Enb Address What 
1   breakpoint  keep y  0x0804842a in copy at copy.c:9 

(gdb) r 
Starting program: /home/~/바탕화면/src/long 
Merry X-max !

Breakpoint 1, copy (from=0x8049b60 "Merry X-mas !", to=0x8049760 "") at copy.c:9
8   i = 0;

이 상태에서 형식 매개변수 인 from 배열의 값을 프린트해 확인해보자. n(ext) 명령어를 이용하여 한 줄씩 두 번 실행한 후에 to 배열의 값을 프린트해보자. 첫 번째 글자인 “M”이 복사되었음을 확인할 수 있다.

(gdb) p from 
$1 = 0x8049b60 "Merry X-mas !"

(gdb) n 
10  while ((to[i] = from[i]) != '\0')

(gdb) n 
11      ++i;

(gdb) p to 
$2 = 0x8049760 "M" 

이어서 c(ontinue) 명령어를 이용하여 계속 실행시키면 복사가 완료되고 다음 입력 “Happy New Year”을 받게 된다. 이 상태에서 다시 형식 매개변수인 from 배열의 값을 프린트해 확인해보자. 다시 n(ext) 명령어를 이용하여 한 줄씩 두 번 실행한 후에 to 배열의 값을 프린트하면 to 배열이 가지고 있는 이전 문자열에 “H”가 복사되었음을 확인할 수 있다.

(gdb) c 
Continuing.
Happy New Year !

Breakpoint 1, copy (from=0x8049b60 "Happy New Year !", to=0x8049760 "Merry X-mas !") at copy.c:9 
8   i = 0;

(gdb) p from 
$3 = 0x8049b60 "Happy New Year !"

(gdb) n 
9   while ((to[i] = from[i]) != '\0')

(gdb) n 
10      ++i;

(gdb) p to 
$4 = 0x8049760 "Herry X-mas !" 

(gdb) c 
Continuing.
Happy New Year !
Program exited normally.