GNU 디버거

보통은 **GDB**라고 부르는 **GNU 디버거**(GNU Debugger)는 GNU 소프트웨어 시스템을 위한 기본 디버거이다. GDB는 다양한 유닉스 기반의 시스템에서 동작하는 이식성있는 디버거로, 에이다, C, C++, 포트란 등의 여러 프로그래밍 언어를 지원한다.

## 역사
GDB는 1988년에서 리처드 스톨만이 처음 작성한 것으로, GNU 일반 공중 사용 허가서하에 배포되는 자유 소프트웨어이다.

1990년부터 1993년까지는 시그너스 솔루션즈에서 근무하는 존 길모어가 관리하였다.

## 기술적인 세부 사항
### 기능
GDB는 컴퓨터 프로그램의 실행을 추적하고 수정할 수 있는 많은 기능들을 제공한다. 사용자는 프로그램의 내부 변수들의 값을 주시하거나 변경할 수 있으며, 프로그램의 일반적인 실행 과정과 독립적으로 함수를 호출할 수도 있다.

GDB는 (2003년 현재) 알파, ARM, H8/300, 시스템/370, 시스템 390, X86, IA-64 "아이테니엄",
모토로라 68000, MIPS, PA-RISC, PowerPC, SuperH, SPARC, VAX와 같은 다양한 머신들을 지원한다.

표준 릴리즈에 포함된 덜 알려진 대상 프로세서로는 A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, 인텔 i960, M32R, 68HC11, 모토로라 88000, MCORE, MN10200, MN10300, NS32K, Stormy16, V850, VAX, Z8000, EISC과 같은 것들이 있으며 이들 중에는 새 릴리즈에 포함되지 않은 것들도 있다.

GDB는 내부에 M32R이나 V850과 같은 거의 알려지지 않은 타겟 프로세서들에 대한 시뮬레이터도 포함하고 있다.

### 원격 디버깅
GDB는 임베디드 시스템을 디버깅할 때 사용되는 '원격' 모드를 지원한다. 원격 디버깅은 GDB가 한 머신 상에서 동작하고, 디버그할 프로그램은 다른 머신 상에서 동작하는 것을 말한다. GDB는 GDB 프로토콜을 알고 있는 원격지의 'stub'과 직렬 포트 혹은 TCP/IP를 통해 통신할 수 있다.

이 원격 디버깅 모드는 리눅스 커널에 사용되는 소스 수준의 디버거인 KGDB에서도 사용된다. KGDB를 사용하면 커널 개발자는 일반 응용 프로그램과 마찬가지로 커널을 디버깅할 수 있다. KGDB는 커널 코드내에 중단점을 삽입하는 것이 가능하며, 코드를 한 단계씩 실행(step)시키거나, 변수의 값을 관찰하는 것이 가능하다. 하드웨어 디버깅 레지스터를 포함하고 있는 프로세서에서는 감시점(watchpoint)을 설정하여 특정 메모리 주소가 접근되거나 실행될 때 중단점을 설정할 수 있다. KGDB는 디버깅할 머신에 직렬 케이블이나 이더넷을 통해 연결될 또 다른 머신을 필요로 한다. FreeBSD에서는 파이어와이어 DMA를 이용한 디버깅도 가능하다.

### 제한 사항
GDB는 자체적인 GUI를 포함하고 있지 않으며 기본적으로 명령행 인터페이스를 사용한다. DDD, GDBk/Insight와 같은 몇 가지 프론트엔드들이 있으며, Emacs에서도 "GUD"모드를 지원한다. 이들은 통합 개발 환경에서 제공하는 것과 비슷한 디버깅 기능들을 제공한다.

메모리 누수 탐지기와 같이 GDB와 연동하여 사용할 수 있는 툴들도 존재한다.

## 명령어 사용 예
 gdb prog.out      prog.out를 디버깅..
 gdb > run         프로그램 실행

## 예제


```
GNU gdb Red Hat Linux (6.3.0.0-1.21rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) run
Starting program: /home/sam/programming/crash
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0xc11000
This program will demonstrate gdb

Program received signal SIGSEGV, Segmentation fault.
0x08048428 in function_2 (x=24) at crash.c:22
22 return *y;
(gdb) edit
(gdb) shell gcc crash.c -o crash -gstabs+
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
warning: cannot close "shared object read from target memory": File in wrong format
`/home/sam/programming/crash' has changed; re-reading symbols.
Starting program: /home/sam/programming/crash
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0xa3e000
This program will demonstrate gdb
24
Program exited normally.
(gdb) quit
```


먼저 프로그램을 실행시키고 세그먼트 폴트의 원인을 찾은 후에 올바른 동작을 하도록 수정(edit)하였다. 수정된 프로그램은 GCC를 통해 다시 컴파일된 후 실행되었다.

## 같이 보기
* 바이너리 파일 디스크립터 라이브러리
* 데이터 디스플레이 디버거
* Gdbserver
* LLDB (디버거)
* 리처드 스톨먼
## 참고 문헌

* Richard M. Stallman, Roland Pesch, Stan Shebs, et al., *Debugging with GDB* (자유 소프트웨어 재단, 2002) 

## 외부 링크
* GDB 홈페이지
* gdb 문서: "Debugging with GDB"  (html 과 400 페이지 이상의 PDF로 제공)
* GDB Internals
* GDB 강좌
* kgdb, 리눅스 커널을 디버깅하기 위한 gdb 백엔드
* Peter Jay Salzman's excellent GDB guide
* GDB를 GUI로 쉽게 조작하는 프론트엔드 프로그램 MyGDB

분류:디버거
디버거