前言

gdb是GNU开源组织发布的一款调试器,提供了丰富的功能。gdb不仅能调试普通的应用程序,还能调试正在运行的进程线程,甚至linux内核。gdb不仅能调试C语言,还可以调试C++,Java等语言编写的程序。有一个不足就是gdb是一个命令行工具,对初学者不太友好,要一段时间适应。

一、基本的调试技术

gdb的功能通过内部的命令和启动时命令行提供,命令行的格式如下:

gdb [options] [exxcutable-file] [core_file or process-id]]
 gdb [options] --args exxcutable-file [inferior-arguments...]

在gdb的命令行可以输入参数和选项,包括指定被调试程序的参数和进程号等。一般使用“gdb<被调试程序名>”的形式启动gdb,不需指定参数

使gcc -g 编译程序,加入-g目的是告诉gcc 在目标文件中生成调试信息,如果不加-g参数,则gdb无法找到供调试用的信息。

以test.c为例
编译

gcc -g test test.c
1.列出源代码
(1)启动gdb调试器
gdb test
(2)进入gdb调试环境之后,输入list 打印出最开始的代码
(gdb) list
(3)查看某一行的代码
(gdb)list 1
(4)list命令每次显示10行 查看某一区间的代码
(gdb)list 17 20
(5)通过函数名显示代码
(gdb)list main

2.断点管理
(1)对指定的行设置断点
(gdb)break 43
(2)对指定的函数设置断点
(gdb)b main
(3)查看断点
(gdb)info breakinfo
(4)关闭断点(后面的数字为断点的标号)
(gdb)disable 2 
(5)使能断点
(gdb)disable 2 
(6)删除断点
delete 2

3.执行程序
使用run和continue run命令仅用在程序最开始执行的时候,continue只能在程序运行后执行

4.显示程序变量
gdb 提供printf和dispaly两显示指令,这两条指令的功能基本相同,区别在于display可以锁定显示的变量和寄存器,当程序执行时,每执行一次都会显示被锁定的变量。print命令只能在调用的时候显示指定的变量或者寄存器值
(gdb)printf count
一般来,printf命令适合偶尔的显示某个变量的值,display命令适合调试程序中的循环,省去了每次手工输入显示变量
当不需要显示某个变量的时候,使用undisplay命令删除锁定的变量
(gdb)undiaplay 1

5.信号管理
gdb的一个特色是能模拟操作系统向被调试额应用程序发送信号,使用“signal<信号名称>”发出指定的信号

6.多进程调试
attch <进程号>