GNU调试器

原始碼層級的除錯程式

GNU侦错器(英语:GNU Debugger,缩写:GDB),是GNU软体系统中的标准侦错器,此外GDB也是个具有移携性的侦错器,经过移携需求的调修与重新编译,如今许多的类UNIX作业系统上都可以使用GDB,而现有GDB所能支援除错的程式语言有CC++Pascal以及FORTRAN

GNU Debugger
开发者GNU计划
当前版本12.1(2022年5月1日,​2年前​(2022-05-01
源代码库 编辑维基数据链接
操作系统类Unix系统Windows
类型调试工具
许可协议GNU通用公共许可证
网站gnu.org/software/gdb/

历史

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

技术细节

特点

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

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

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

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

远端侦错

 
GDB的一大特点是:除了具备传统的本机端、近端侦错外,也可透过接线、网路的通讯方式进行远端性的遥控侦错。

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

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

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

现有限制

GDB运用上最明显的限制是在“使用者介面”的部分,预设只有命令列介面(CLI)可用,而不具备较能亲合上手、直觉操作的图形化使用者介面(GUI),不过此一弱处也已经有几个前端程式为其补强,例如DDDGDBtkInsight页面存档备份,存于互联网档案馆)以及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)重新编译并再次执行。

参考

外部链接