首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.8.2  Gdb调试有问题的程序

1.实验目的

通过调试一个有问题的程序,使读者进一步熟练使用Vi操作,而且熟练掌握Gcc编译命令及Gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35行,希望读者认真调试。

2.实验内容

1)使用Vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码如下所示:

 

#include <stdio.h>

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", string);

}

int display2 (char *string1)

{

       char *string2;

       int size,i;

       size = strlen (string1);

       string2 = (char *) malloc (size + 1);

       for (i = 0; i < size; i++)

               string2[size - i] = string1[i];

       string2[size+1] = ' ';

       printf("The string afterward is %s\n",string2);

}

 

2)使用Gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。

3)运行生成的可执行文件,观察运行结果。

4)使用Gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。

5)纠正错误,更改源程序并得到正确的结果。

3.实验步骤

1)在工作目录上新建文件greet.c,并用Vi启动:vi greet.c

2)在Vi中输入以上代码。

3)在Vi中保存并退出:wq

4)用Gcc编译:gcc -g greet.c -o greet

5)运行greet./greet,输出为:

 

The original string is Embedded Linux

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]”。

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 -g greet.c -o greet

20)查看运行结果:./greet

 

The original string is Embedded Linux

The string afterward is xuniL deddedbmE

 

这时,输入结果正确。

4.实验结果

将原来有错的程序经过Gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论