Linux下C编程基础之:实验内容

时间:2013-09-13来源:网络

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调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。

1 2 3 4

关键词: C编程 实验 Linux VI

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版