Linux下C编程基础之:实验内容
3.7.2用gdb调试程序的bug
1.实验目的
通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35行,希望读者认真调试。
2.实验内容
(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码如下所示:
#includestdio.h>
intdisplay1(char*string);
intdisplay2(char*string);
intmain()
{
charstring[]=EmbeddedLinux;
display1(string);
display2(string);
}
intdisplay1(char*string)
{
printf(Theoriginalstringis%sn,string);
}
intdisplay2(char*string1)
{
char*string2;
intsize,i;
size=strlen(string1);
string2=(char*)malloc(size+1);
for(i=0;isize;i++)
{
string2[size-i]=string1[i];
}
string2[size+1]='';
printf(Thestringafterwardis%sn,string2);
}
(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。
(3)运行生成的可执行文件,观察运行结果。
(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
3.实验步骤
(1)在工作目录上新建文件greet.c,并用vi启动:vigreet.c。
(2)在vi中输入以上代码。
(3)在vi中保存并退出,使用命令“:wq”。
(4)用gcc编译:gcc-ggreet.c-ogreet。
(5)运行greet,使用命令“./greet”,输出为:
TheoriginalstringisEmbeddedLinux
Thestringafterwardis
可见,该程序没有能够倒序输出。
(6)启动gdb调试:gdbgreet。
(7)查看源代码,使用命令“l”。
(8)在30行(for循环处)设置断点,使用命令“b30”。
(9)在33行(printf函数处)设置断点,使用命令“b33”。
(10)查看断点设置情况,使用命令“infob”。
(11)运行代码,使用命令“r”。
(12)单步运行代码,使用命令“n”。
(13)查看暂停点变量值,使用命令“pstring2[size-i]”。
(14)继续单步运行代码数次,并检查string2[size-1]的值是否正确。
(15)继续程序的运行,使用命令“c”。
(16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的赋值都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故不能输出任何结果。
(17)退出gdb,使用命令“q”。
(18)重新编辑greet.c,把其中的“string2[size-i]=string1[i]”改为“string2[size–i-1]=string1[i];”即可。
(19)使用gcc重新编译:gcc-ggreet.c-ogreet。
(20)查看运行结果:./greet
TheoriginalstringisEmbeddedLinux
ThestringafterwardisxuniLdeddedbmE
这时,输出结果正确。
4.实验结果
将原来有错的程序经过gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论