GDB是GNU项目的一个源码级调试工具,它广泛用于Linux和Unix平台,特别是在计算机科学系的sparcs和Linux系统上。GDB不仅可以调试用高级语言(比如C和C++)编写的程序,还能调试汇编语言程序。本文档主要聚焦于后者,即如何使用GDB调试汇编语言编写的代码。
调试汇编代码时,GDB作为一个传统的命令行调试器运行在普通的终端窗口中就足够了。但是,如果需要调试高级语言源代码,利用像Emacs编辑器中的GDB前端,或者使用xxgdb或者DDD这样的图形界面工具会更为方便。这些图形界面工具提供了一个更为直观的调试环境,不过基本的调试命令保持一致。
在使用GDB调试汇编程序之前,你首先需要确保你的开发环境已经安装了GNU工具包。这通常意味着你需要把GNU的包加入到你的环境变量中。使用GDB的基本命令很简单。比如,如果你需要编译一个程序以便进行调试,你应该在gcc编译命令中加上-g选项。这样做会在目标文件中包含额外的调试信息,从而能够将目标代码映射回源代码。
例如,如果你有两个文件需要编译,一个是以C语言写的主驱动程序fooDriver.c,另一个是汇编语言写的程序fooRoutine.s,你可以使用以下命令来编译并为调试做准备:
```bash
gcc -g -o foo fooDriver.c fooRoutine.s
```
之后,为了在GDB下启动调试,你只需要运行:
```bash
gdb foo
```
这会加载你的程序foo,并启动GDB的命令行解释器,等待你输入命令。只有当你指示程序开始执行时,程序才会真正运行。
在GDB中,有几个基本的命令是特别有用的:
- help [keyword]:显示帮助信息。
- run [args]:开始程序执行。如果程序通常需要命令行参数(例如foo hi 3),你在这里需要指定它们(例如,run hi 3)。
- break [address]:在指定地址处设置断点(如果没有指定地址,则使用当前地址)。地址可以是符号的(例如,foo),也可以是数字的(例如,*0x10a38)。当程序执行到达断点时,你将被弹回GDB的命令行解释器。在断点之后,你可以选择继续执行。
- continue:继续执行程序,直到到达下一个断点。
- info breakpoints:显示当前设置的所有断点列表。
- delete breakpoints number:删除指定的断点编号。
- print [/format] expr:使用指定的格式打印一个表达式的值。
值得注意的是,很多命令可以缩写。比如,通常按下回车键会重复上一个命令,有时候还会前进到当前位置。
GDB的功能非常强大,支持很多高级的调试功能,如监视点、信号处理、多线程调试等等。因此,针对GDB的详细使用信息,建议查阅其官方文档,或者利用info命令来获取具体使用说明。在终端中使用info命令时,可以输入info gdb来获取如何使用GDB的帮助文档。如果需要更多关于如何使用info命令的帮助,可以输入h(info命令会提供一个如何使用的简介)。这些信息能帮助你深入理解GDB的各种高级功能和调试技巧。