GNU侦错器

**GNU 偵錯器**（英語：**G**NU **D**e**b**ugger，縮寫：**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 的內部已具備了依據各種支援不同處理器的指令集所編譯成的類比推演程式（Simulator），就連大眾少知少用的 M32R、V850 等架構的處理器也都具備。

### 遠端偵錯

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) （英文）