欢迎来到CloudService文涵的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

【linux上机实验】实验七 Linux开发工具的使用(二)

因为第一题只是演示,从第二题开始做。


如需查看最后提交的完成文档请下载(文档的作用是为了让大家明白提交作业时该截什么样的图,该写什么命令,因为文档中很多步骤没有,所以做作业请按照博客步骤做,很详细!!!)

实验七 Linux开发工具的使用(二)(完成版)


2.利用gcc 编译下列C 语言程序,查看运行结果,如果有错用gdb调试之。

创建程序名为bugging.c的文件(题目要求的是这个文件名,不要改)
1.命令:vi bugging.c

2.将下面的内容粘贴到bugging.c中:
#include<stdio.h>
double average_(int array[],int *min,int *max,int num)
{
	int i ,s=0;
	double ave;
	*min=*max=array[0];
	for(i=1;i<num;i++)
	{	if(array[i]>*max)
			*max=array[i];
		if(array[i]<*min)
			*min=array[i];
		s+=array[i];
   }
  ave=s*1.0/num;
  return ave;
}
int main(void)
{    
	int i,max,min;
	int a[5]={3,5,1,4,6};
	double aver;
	aver=average_(a,&min,&max,5);
	for(i=0;i<5;i++)
		printf("%d ",a[i]);
	printf("\n");
	printf("min=%d,max=%d,aver=%.2f\n",min,max,aver);
	return 0;
}


3.编译该程序: 
	命令:gcc  -o  bugging  -g  bugging.c 

4.运行该程序:
	命令:./bugging

机子作出如下响应:
image

求平均值结果不对,为了查找该程序中出现的问题,我们利用gdb,并按如下的步骤进行:

(1)进入 gdb,装入可执行文件,命令为:gdb bugging

image

(2)利用list 1命令查看程序代码,命令为:list 1

image

(3)在主函数定义数组地方先设置一个断点,命令为:

首先查看数组所在行数:list 1
image

命令: break 20(查看自己的定义数组所在的位置在多少行,这里就写多少,我的是20行)
image

(4)要得到正确的平均值,累加结果必须正确,所以在求累加和的地方再设置一个断点, 命令为:

再次查看累加和所在行数:用上面查看数组的方法再次查看累加和所在的位置,并设置断点

命令: break 12(查看自己的累加和所在的位置在多少行,这里就写多少,我的是12行)
image

(5)查看所设断点信息,命令为:info b

image

(6)暂时取消断点1,命令为:disable 1

查看断点信息。
image

(7)重新让断点1有效,命令为:enable 1

查看断点信息。
image

(8)运行程序,命令为:run

image

(9)程序会在所设置的第一个断点处停止,显示:

Breakpoint 1, main () at sy7_2.c:21
21		int a[5]={3,5,1,4,6};
(gdb)

(10)用print命令查看数组a的内容,命令为:print a

image

数组中数是些什么数?

答:数组中数是 4196160, 0, 4195472, 0, -6560

(11)单步不跟踪运行程序,命令为:next

image

再用p命令查看数组a的内容。截屏:
命令: p a
image

(12)单步跟踪运行程序,命令为:

显示:
(gdb) s
average_ (array=0xbffff2e4, min=0xbffff308, max=0xbffff304, num=5)
		at sy7_2.c:4
4		int i ,s=0;
(gdb)

(13)运行到断点处,命令为:continue

image

(14)程序会在所设置的第二个断点处停止,显示:

Breakpoint 2, average_ (array=0xbffff2e4, min=0xbffff308, max=0xbffff304, 
		num=5) at sy7_2.c:13
13			s+=array[i];
(gdb)

(15)单步运行程序,执行累加,查看累加结果,命令为:print s

image

(16)发现累加的不是数组中的第一个数,找到错误所在。

出错点为:在average_函数中,由于循环从1开始,而不是从0开始,导致第一个数没有被累加到。

(17)清除所设断点,命令为:delete 1 ;delete 2

image

(18)退出gdb,命令为:ctrl+D或输入quit

image

(19)进入vi修改程序命令为:vi bugging.c

image

image

保存文件退出vi环境命令为: :wq

(20)重新编译运行程序,给出正确结果截图。

命令1:gcc -o bugging -g bugging.c

命令2:./bugging

正确结果截图
image

posted on 2023-11-22 22:27  Cloudservice  阅读(883)  评论(0编辑  收藏  举报