新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux下C编程基础之:gdb调试器

Linux下C编程基础之:gdb调试器

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257150.htm

(2)设置断点。

设置断点是调试程序中一个非常重要的手段,它可以使程序运行到一定位置时暂停。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。

在gdb中设置断点非常简单,只需在“b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点),如下所示:

(gdb)b6

Breakpoint1at0x804846d:filetest.c,line6.

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

(3)查看断点情况。

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

(gdb)infob

NumTypeDispEnbAddressWhat

1breakpointkeepy0x0804846dinmainattest.c:6

用户在断点键入“backrace”(只输入“bt”即可)可以查到调用函数(堆栈)的情况,这个功能在程序调试之中使用非常广泛,经常用于排除错误或者监视调用堆栈的情况。

(gdb)b19

(gdb)c

Breakpoin2,sum(m=50)attest.c:19

19printf(“Thesumof1-mis%dn”,n);

(gdb)bt

#0sum(m=50)attest.c:19 /*停在test.c的sum()函数,第19行*/

#10x080483e8inmain()attest.c:6/*test.c的第6行调用sum函数*/

(4)运行代码。

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

(gdb)r

Startingprogram:/root/workplace/gdb/test

Readingsymbolsfromsharedobjectreadfromtargetmemory...done.

LoadedsystemsuppliedDSOat0x5fb000

Breakpoint1,main()attest.c:6

6sum(50);

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

(5)查看变量值。

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

(gdb)pn

$1=0

(gdb)pi

$2=134518440

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

小技巧

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

(6)单步运行。

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

(gdb)n

Thesumof1-mis1275

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

(gdb)s

sum(m=50)attest.c:16

16inti,n=0;

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

(7)恢复程序运行

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

(gdb)c

Continuing.

Thesumof1-50is:1275

Programexitedwithcode031.

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

小知识

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

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭