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)重新编译并再次执行。

参考

编辑

外部链接

编辑