GNU调试器
开发者 | GNU计划 |
---|---|
当前版本 | 12.1(2022年5月1日 | )
源代码库 | |
操作系统 | 类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)负责后续的软件维护工作。
技术细节
特点
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) (英文)