您的当前位置:首页正文

实验三、用GDB调试程序的bug

来源:独旅网


实验名称 实验时间 实验三 用GDB调试程序的bug

05 月 23 日星期 四 第 3 节

实验目的 通过调试一个有问题的程序,使读者进一步熟练使用vim操作,并且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。 实验环境 VMware虚拟机、Linux操作系统 实验内容(步骤、方法、算法、程序) 实验内容: 使用VI编辑器,将以下代码输入到名为greet.c 的文件中。此代码的原意为输出倒 序main函数中定义的字符串,但结果显示没有输出。代码如下所示: . #include int display1(char *string); int display2(char * string); int main (){ char string[ ] = \"Embedded Linux\"; display1 (string); display2 (string); } int display1 (char *string) { printf (\"The original string is %s \\n\} int display2 (char * string1){ char *string2; int size,i; size = strlen (string1); string2 = (char *) malloc (size + 1); for(i=0;i(3)运行生成的可执行文件,观察运行结果。 (4)使用Cdb调试程序,通过设置断点、 单步跟踪,一步步找出错误所在。 (5)纠正错误,更改源程序并得到正确的结果。 实验步骤: (1)在工作目录上新建文件greet.c,并用vim进入文件进行编辑 (2)在Vi中输入以上代码。 (3)在Vi中保存并退出: wq。 (4)用Gcc编译: gcc -g greet.c -o greet (5)运行greet: . /greet 产生此错误的原因是少了两个头文件 #include #include 输入头文件再运行这个错误就没有了 输出为: The original string is Embedded Limux The string afterward is 可见,该程序没有能够倒序输出。 (6)启动Gdb调试: gdb greet (7)查看源代码,使用命令”l”。 (8)在30行(for循环处)设置断点,使用命令”b 30\"。 (9)在33行(printf函数处)设置断点,使用命”b 33。 (10)查看断点设置情况,使用命令info b” (11)运行代码,使用命令“r”。 (12) 单步运行代码,使用命令“n”。 (13)查看暂停点变量值,使用命令”p string2[size-i]\"。 (12)继续单步运行代码数次,并使用命令查看,发现string2[size-i]的值是正确的 (15)继续程序的运行,使用命令”c”。 (16)此时依次查看sting2[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 -g greet.c -o greet (接上) (20)查看运行结果 ./greet 实验内容The original string is Embedded Linux (步骤、The string aferward is xuniL deddedbmE 方法、算法、程序) 这时,输入结果正确。 本实验部分代码 int display2 (char * string1){ char *string2; int size,i; 部分源程size = strlen (string1); 序代码/string2 = (char *) malloc (size + 1); 实验配置 for(i=0;i

因篇幅问题不能全部显示,请点此查看更多更全内容