GNU侦错器

GNU侦错器（GNU Debugger，缩写：GDB），是GNU软件系统中的标准侦错器，此外GDB也是个具有移携性的侦错器，经过移携需求的调修与重新编译，如今许多的类UNIX操作系统上都可以使用GDB，而现有GDB所能支援除错的程式语言有C、C++、Pascal以及FORTRAN。

## 历史

GNU Debugger最初是在1988年由理查德·马修·斯托曼（Richard Stallman）所撰写，之后以GNU通用公共许可证（GNU General Public License, GNU GPL）的授权方式将软件释出，因此GNU Debugger是一套自由软件。释出后的1990年－1993年间则由任职于Cygnus Solutions公司的约翰·吉尔摩（John Gilmore）负责后续的软件维护工作。

## 技术细节

### 特点

GDB具备各种侦错功效，能针对计算机程序的执行进行追踪与警告，使用GDB的除错人员可以监督及修改程式的内部变数值，甚至监督与修改独立于主程式运作外，以独立个体型态呼用（呼叫使用）的函式。

GDB能为多种不同处理器架构上执行的软件进行侦错，这些处理器架构包括：DEC/COMPAQ/HP的Alpha、ARM的ARM、Hitachi的H8/300、IBM的System/370、System 390、Intel的X86及X86-64、IA-64 "Itanium"、Motorola 68000、MIPS的MIPS、HP的PA-RISC、AIM联盟的PowerPC、Hitachi/Renesas/ST的SuperH、Sun的SPARC、DEC/COMPAQ/HP的VAX。

此外一些比较少人知的处理器也一样受GDB支援，包括：AMD的A29K、ARC的ARC、Atmel的AVR、Axis Communications的ETRAX CRIS、D10V、D30V、Fujitsu的FR-30、FR-V、Intel的i960、Renesas的M32R、Motorola的68HC11、Motorola的88000、Freescale的MCORE、MN10200、MN10300、NS32K、Stormy16、V850、以及Zilog的Z8000，此外更后续版本的GDB只会增加更多的处理器支援而不会短少。

GDB的内部已具备了依据各种支援不同处理器的指令集所编译成的模拟推演程式（Instruction Set Simulator），就连大众少知少用的M32R、V850等架构的处理器也都具备。

### 远端侦错

<image>

GDB具有一种“远端，Remote”模式，此种模式多半是在为嵌入式系统进行侦错时使用，远端操作指的是：GDB在一部机器内执行，而要进行侦错的程式是在另一部机器上执行，接着欲侦错的机器上会再加装一个名为“Stub”的小程式，该程式能够与另一端的GDB程式沟通，沟通的路径可以是两部机器间的串接式接线，也可以是支援TCP/IP协定传输的各种网络，在TCP/IP网络及协定上再加搭传输GDB专有的除错操作用通讯协定，如此便能进行远端侦错。

不仅GDB有远端模式，KGDB也同样具有远端模式，KGDB主要是为执行中的Linux核心进行侦错，而GDB则是主要是用在原代码的层次。运用KGDB，负责核心程式的程序员可以将核心以近似于应用程序的除错方式来侦错，包括为核心程式码设置中断点（breakpoint）、让核心程式以步阶方式逐行执行以及观看变数值等。

在某些架构的处理器中，会以硬件方式提供一些侦错功用的寄存器，以及可以设定观察点（Watchpoint），观察点的功用是：当程序员指定的内存位址被执行到或访问到时，观察点即会去触发、触动一个中断点。对此KGDB可以安装在一部传统机器上，并透过远端模式使用另一部受侦错机器上的硬件侦错功效，同样的两部机器可用各种方式进行沟通，如串接式接线、以太网路等，尤其在FreeBSD操作系统上还允许使用FireWire接线，并用直接内存访问（Direct Memory Access，DMA）的功效来协助远端侦错。

### 现有限制

GDB运用上最明显的限制是在“使用者界面”的部分，预设只有命令列界面（CLI）可用，而不具备较能亲合上手、直觉操作的图形化使用者界面（GUI），不过此一弱处也已经有几个前端程式为其补强，例如DDD、GDBtk／ Insight 以及Emacs中的“GUD 模式”等，有了这些补强后，GDB在功效使用的便利性上就能够与“整合发展环境中的侦错功效使用”相接近。

另外，有些侦错工具（软件）也被设计成能与GDB搭配使用，例如内存泄漏（memory leak）的侦测程式。

## 命令列使用的范例

```
gdb prog.out      debug prog.out
(gdb) run         run
```

## 过程范例

以下是用GDB进行除错的一段过程示范，欲进行侦错的程式已在栈追踪区内：

```
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
```

这个程式已处在执行阶段，之后找出这个程式中会导致执行错误的段落，然后将对应处的原代码用编辑器进行错误修订，更正完成后用GNU 编译器（GCC）重新编译并再次执行。

## 参考

- 书籍：Debugging with GDB（在此暂译成：用GDB进行除错）
- 出版：2002年，自由软件基金会（Free Software Foundation，FSF）
- ISBN 1-882114-88-4
- 作者：Richard M. Stallman、Roland Pesch、Stan Shebs及其他所有参与成员

## 外部链接

- GDB的官方网站
- GDB文件："Debugging with GDB，用GDB进行除错" （线上HTML格式，折算成PDF格式则超过400页）
- 深入GDB
- 使用GDB进行C及C++程式语言的除错
- 用来替Linux核心进行除错的GDB后端程式：KGDB
- Peter Jay Salzman所撰：如何更专精、善用GDB
- GDB内部结构 (The Architecture of Open Source Applications, Volume II - ISBN 9781105571817)

## 基本资料

- 日语原文：GNU Debugger
- 开发者：GNU计划
- 软件版本周期：17.2
- 操作系统：类Unix系统、Windows
- 类型：调试工具
- 许可协议：GNU通用公共许可证
- 网站： gnu.org/software/gdb/