GDB调试程序常用方法及命令整理

GDB常用命令表

GDB命令格式含义简写
listlist line1,line2列出文件的代码l
printprint p打印变量内容p
breakbreak [行号或函数名称]设置断点b
continuecontinue[开始,结束]继续运行c
infoinfo para列出信息i
nextnext下一行n
stepstep进入函数S
displaydisplay para显示参数
filefile path加载文件
runrun运行程序r

GDB使用

一.启动GDB

要用GDB调试程序,需要在程序编译时添加-g,假如有一个文件名为test.c,需要对它进行调试,则需要使用以下命令生成一个可调试的可执行文件

$gcc -o test test.c -g

如上,有一个可调试的程序test后,需要使用GDB加载程序,主要有以下两种方法:
1.使用 “gdb 程序名”

$ gdb test
/*********gdb界面*********/
Reading symbols from /home/csr/Documents/dir/test...done.

2.使用gbd命令进入界面后,使用 “file 程序名”

$gbd
/*********gdb界面*********/
(gdb) file test
Reading symbols from /home/csr/Documents/dir/test...done.

二.运行程序

加载完成后,如果要运行准备好的程序,可以使用run程序,run程序后跟传递给程序的参数。

(gdb) run
Starting program: /home/csr/Documents/dir/test 
hello world[Inferior 1 (process 7871) exited normally]

三.设置和显示参数

使用set args命令来设置发送给程序的参数;使用show args命令可以查看其默认的参数。

(gdb) args 3
(gdb) show args
Argument list to give program being debugged when it is started is "3".

四.查看源代码

使用list(简写l)可以打印文件代码,命令格式为

list line1,line2

该命令打印从line1到line2之间的代码。如果不输入参数则从当前行开始打印,默认一次打印10行

(gdb) list 2,5
2	
3	int main()
4	{
5		printf("hello world");

五.查看变量及变量类型

查看变量

print(简写p)命令可以打印变量或表达式的值。其可以打印任何有效的表达式的值和变量值,格式为:

(gdb) print var                //(var为参数)
//打印常量表达式的值
(gdb) print 3+2
$1 = 5
//打印保存在全局变量中的历史值
(gdb) print $1
$2 = 5

此外,print可以打印调用函数的返回值、结构中的各成员值。
还可以使用print打印构造数组的值,给出数组指针头并设置要打印的结构数量,print命令会依次打印。格式为

(gbd)print 基地址@个数

例如,有如下结构

struct temp{
	int a;
	int b;
};

*io为结构temp的头,则以下例子打印从io开始的两个数据结构

(gdb) p *io@2

查看变量类型

查看变量类型主要使用两个命令:whatis、ptype

  • whatis
    该命令可以查看变量的类型,该命令的格式为"whatis 变量名",其中变量名是要查看的变量,
    例如
(gdb) whatis io
type = struct temp *
  • ptype
    该命令可以查看结构的详细定义,格式为"ptype 变量名",与whatis相比,它能得到变量的详细信息。例如
(gdb) ptype io
type = struct temp {
    int a;
    int b;
} *
(gdb) ptype *io
type = struct temp {
    int a;
    int b;
}

六.断点

1.设置断点

使用break设置断点,简写为b。有如下几种形式,注意,GDB的停止位置都是在执行程序行之前。

  • break 行号:程序停止在设定的行前
  • break 函数名:程序停止在设定的函数前
  • break 行号或者函数 if条件:条件断点设置命令,如果条件为真则到达指定行或函数时停止。
(gdb) break 3
Breakpoint 1 at 0x400531: file test.c, line 3.
(gdb) run
Starting program: /home/csr/Documents/dir/test 

Breakpoint 1, main () at test.c:5
5		printf("hello world");
(gdb) break 2 if 1
Note: breakpoint 1 also set at pc 0x400531.
Breakpoint 2 at 0x400531: file test.c, line 2.

2.查看断点

对于设置过的断点,可以使用info break查看

(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at test.c:3
	breakpoint already hit 1 time
2       breakpoint     keep y   0x0000000000400531 in main at test.c:2
	stop only if 1

以上信息中,Num为断点编号,Type是信息的类型,Disp是描述,Enb说明断点是否有效,Address是断点在内存中的地址,What是对断点在源文件中位置的描述。

breakpoint already hit 1 time 表示已经命中了一次断点

3.删除断点

删除断点使用命令delete,格式为“delete breakpoint 断点编号”。
例如,以下语句删除第二个断点:

(gdb) delete breakpoint 2
(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at test.c:3
	breakpoint already hit 1 time

如果不带断点编号,将删除所有断点

4.禁止/允许断点

禁止某个断点使用命令disable,相对的运行某个断点使用命令enable,格式如下:

(gdb) disable b 断点编号
(gdb) enable b 断点编号

使用此命令会改变断点信息中的Enb

5.清除断点

一次性清除某行的所有断点使用命令clear,这个命令将清除某行的所有断点信息。使用clear清除某行的断点后,GDB将不再保存这些断点的信息,必须重新设置断点

(gdb) clear 行号

六.单步调试

在调试时常常遇到要单步跟踪的情况,并在适当时候进入函数体内部继续跟踪。GDB的next和step命令提供了这种功能,next命令是单步跟踪的命令,简写为n;step是可以进入函数体的命令,简写为s。如果已进入某个函数,想退出函数返回到调用的函数中,则使用命令finish。

七.设置监测点

命令dispaly可以显示某个变量的值,在结束或遇到断点时,将设置变量的值显示出来。display只显示作用域内变量的值。

(gdb) display io
1: io = (struct temp *) 0x602010
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/csr/Documents/dir/test 

Breakpoint 1, main () at test.c:10
10		printf("hello world");
1: io = (struct temp *) 0x602010

八.调用路径

backtrace(简写bt)命令打印函数的调用路径,提供向前跟踪功能。该命令会打印一个顺序列表,显示函数从最近到最远的调用过程,包含调用函数和其中的参数。

九.退出GDB

输入q或者quit即可退出GDB

(gdb) quit
(gdb) q

参考自《LINUX网络编程》第二章

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值