3 min to read
Linux gdb 디버거

gdb 디버거
유닉스/리눅스 시스템에서 프로그램을 디버깅하기 위한 가장 대표적인 디버거로 GNU 디버거 gdb가 있다. gdb는 다양한 유닉스 기반의 시스템에서 동작하는 이식성 있는 디버거로, Ada, C, C++, 포트란 등의 여러 프로그래밍 언어를 지원한다. gdb는 1988년 리처드 스톨만이 처음 작성한 것으로 , 무료로 사용할 수 있는 자유 소프트웨어이다.
gdb 사용
- 정지점(breakpoint) 설정
- 한 줄씩 실행
- 변수 접근 및 수정
- 함수 탐색
- 추적(tracing)
$ gcc -g -o long long.c
$ gcc -g -o main main.c copy.c
$ gdb [실행파일]
gdb 디버거는 실행파일을 이용하여 디버깅 모드로 실행한다.
gdb 기능
gdb의 기본 기능은 소스 보기, 정지점 설정, 프로그램 수행, 변수 값 프린트 등으로 구분할 수 있다.
-
소스보기: l(ist)
l [줄번호] 지정된 줄을 프린트
l [파일명]:[함수명] 지정된 함수를 프린트set listsize n 출력되는 줄의 수를 n으로 변경
-
정지점: b(reak), clear, d(elete)
b [파일:]함수 파일의 함수 시작 부분에 정지점을 설정
b n n번 줄에 정지점을 설정
b +n 현재 줄에서 n개 줄 이후 지점에 정지점 설정
b -n 현재 줄에서 n개 줄 이전 지점에 정지점 설정
info b 현재 설정된 정지점을 출력clear 줄번호 해당 정지점을 삭제
d 모든 정지점을 삭제 -
프로그램 수행
r(un) 인수 명령줄 인수를 받아 프로그램 수행
k(ill) 프로그램 수행 강제 종료
n(ext) 멈춘 지점에서 다음 줄을 수행하고 멈춤
s(tep) n과 같은 기능이나 함수 호출 시 함수 내부로 들어감
c(ontinue) 정지점을 만날 때까지 계속 수행
u 반복문에서 빠져나옴
finish 현재 수행하는 함수의 끝으로 이동
return 현재 수행중인 함수를 빠져나옴 -
변수 값 프린트: p(rint)
p /[출력형식] [변수명] 해당 변수 값 프린트
출력형식: t(2진수), o(8진수), d(10진수), u(부호 없는 10진수), x(16진수), c(최초 1바이트를 문자형), f(부동 소수점 값 형식)p 파일명::[변수명] 특정 파일의 전역변수 프린트
p [함수명]::[변수명] 특정 함수의 정적 변수 프린트
info locals 현재 상태의 지역변수 리스트 -
정료: quit
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.
Comments