【Linux基础】Gdb使用流程 之二

可以看出,在Gdb 的启动画面中指出了Gdb 的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。

1. 查看文件

在 Gdb 中键入“l”(list)就可以查看所载入的文件,如下所示:

注意

在Gdb的命令中都可使用缩略形式的命令,如“l”代便“list”,“b”代表“breakpoint”,“p”代表“print”等,读者也可使用“help”命令来查看帮助信息。

(Gdb) l

1 #include <stdio.h>

2 int sum(int m);

3 int main()

4 {

5 int i,n=0;

6 sum(50);

7 for(i=1; i<=50; i++)

8 {

9 n += i;

10 }

(Gdb) l

11 printf("The sum of 150 is %d \n", n );

12

13 }

14 int sum(int m)

15 {

16 int i,n=0;

17 for(i=1; i<=m;i++)

18 n += i;

19 printf("The sum of 1m is = %d\n", n);

20 }

可以看出,Gdb 列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。

2. 设置断点

设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置可以方便地查看变量的值、堆栈等情况,从而找出代码的症结所在。在 Gdb 中设置断点非常简单,只需在“b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示:

(Gdb) b 6

Breakpoint 1 at 0x804846d: file test.c, line 6.

要注意的是,在Gdb 中利用行号设置断点是指代码运行到对应行之前将其停止,如上例中,代码运行到第6行之前就暂停(并没有运行第6 行)。

3. 查看断点情况

在设置完断点之后,用户可以键入“info b”来查看设置断点的情况,在Gdb 中可以设置多个断点。

(Gdb) info b

Num Type Disp Enb Address What

1 breakpoint keep y 0x0804846d in main at test.c:6

4. 运行代码

接下来就可运行代码,Gdb默认从首行开始运行代码,可键入“r”(run)即可(若想从程序中指定行开始运行,可在r 后面加上行号)。

(Gdb) r

Starting program: /root/workplace/Gdb/test

Reading symbols from shared object read from target memory done.

Loaded system supplied DSO at 0x5fb000

Breakpoint 1, main () at test.c:6

6 sum(50);

可以看到,程序运行到断点处就停止了。

5. 查看变量值

在程序停止运行之后,程序员所要做的工作是查看断点处的相关的变量值。在Gdb 中只需键入“p”+变量值即可,如下所示:

(Gdb) p n

$1 = 0

(Gdb) p i

$2 = 134518440

在此处,为什么变量“i”的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没把“i”的数值赋为零,而只是一个随机的数字。但变量“n”是在第四行赋值的,故在此时已经为零。

小技巧

Gdb 在显示变量值时都会在对应值之前加上“$N”标记,它是当前变量值的引用标记,所以以后若想再次引用此变量就可以直接写作“$N”,而无需写冗长的变量名。

6. 单步运行

单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别是:若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。因此,“s”就类似于VC等工具中的“step in”,“n”类似与VC等工具中的“step over”。它们的使用如下所示:

(Gdb) n

The sum of 1-m is 1275

7 for(i=1; i<=50; i++)

(Gdb) s

sum (m=50) at test.c:16

16 int i,n=0;

可见,使用“n”后,程序显示函数sum的运行结果并向下执行,而使用“s”后则进入到sum函数之中单步运行。

7. 恢复程序运行

在查看完所需变量及堆栈情况后,就可以使用命令“c”(continue)恢复程序的正常运行了。这时,它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。以下是之前使用“n”命令恢复执行后的结果:

(Gdb) c

Continuing.

The sum of 1-50 is :1275

Program exited with code 031.

可以看出,程序在运行完后退出,之后程序处于“停止状态”。

小知识

在Gdb中,程序的运行状态有“运行”、“暂停”和“停止”3种,其中“暂停”状态为程序遇到断点或观察点之类的,程序暂时停止运行,而此时函数的地址、函数参数、函数内的局部变量都会被压入“栈”(Stack)中。故在这种状态下可以查看函数的变量值等各种属性。但在函数处于“停止”状态之后,“栈”就会自动撤销,也就无法查看各种信息了。

 

参考来源:【Linux基础】Gdb使用流程 之二
http://www.weicedu.com/forum.php?mod=viewthread&tid=599&fromuid=18
(出处: http://www.weicedu.com/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值