GNU Debugger
开发者GNU计划
稳定版本8.3 ( 2019年5月11日,​3个月前​(2019-05-11
源代码库
  • sourceware.org/git/gitweb.cgi?p=binutils-gdb.git
操作系统类Unix系统、Windows
类型调试工具
许可协议GNU通用公共许可证
网站gnu.org/software/gdb/

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英语John Gilmore (advocate))负责后续的软件维护工作。

技术细节

特点

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英语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的GUI化前端程序:Insight(过去称GDBtk),图中为“堆栈浏览器”部分。

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

另外,有些侦错工具(软件)也被设计成能与GDB搭配使用,例如存储器泄漏(memory leak)的侦测程序。

命令行使用的示例

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

过程示例

以下是用GDB进行调试的一段过程示范,欲进行侦错的程序已在堆栈追踪英语Stack trace区内:

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 arewelcome 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_dblibrary "/lib/libthread_db.so.1".(gdb) runStarting program: /home/sam/programming/crashReading symbols from shared object read from target memory...done.Loaded system supplied DSO at 0xc11000This program will demonstrate gdbProgram received signal SIGSEGV, Segmentation fault.0x08048428 in function_2 (x=24) at crash.c:2222         return *y;(gdb) edit(gdb) shell gcc crash.c -o crash -gstabs+(gdb) runThe program being debugged has been started already.Start it from the beginning? (y or n) ywarning: 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/crashReading symbols from shared object read from target memory...done.Loaded system supplied DSO at 0xa3e000This program will demonstrate gdb24Program exited normally.(gdb) quit

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

www.zuoweixin.com
问题反馈联系QQ:暂无联系方式,也可发qq邮箱。