【Linux学习】实验12_Linux软件开发工具(2)

曾巧文 发布于:2012-5-17 22:51 分类:Linux学习 标签: Ubuntu linux 实验

 

实验12 Linux软件开发工具(2)

一、            实验目的

1、  掌握调试工具gdb的使用,练习代码调试的能力。

2、  掌握项目管理工具make的使用,学习Makefile的写法。

 

二、            实验要求

1、  硬件基本配置要求:双核CPU, 1G内存, 20G硬盘空间;软件需求:Windows XP以上系统,VMware 7.0Ubuntu10.04 DVD安装镜像。

2、  分组安排:11组;时间安排:2个课时;实验类型:验证型。

3、  实验的过程中完成实验报告,并于实验结束后上传到FTP服务器指定目录。

 

三、            背景知识

1、  GDBGNU开源组织发布的一个强大的UNIX下的程序调试工具。常用的GDB命令如下表所示。

linux开发

Linux软件开发工具

 

四、            实验内容

1、  使用GDB单步执行和跟踪函数调用:

Ø  查看老师提供的main.c文件的内容,分析程序的作用

Ø   

Ø  使用命令:gcc  main.c  -g  -o  main编译main.c源代码。(注意:在编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试。)

Ø  使用命令:./main,运行main程序,并观察程序运行结果是否正确。

Ø  result[1-10]=5214311

Ø  result[1-100]=-1081998018

Ø  不正确

Ø  使用命令gdb  main,对main可执行程序进行调试。可以看到gdb提供了一个类似Shell的命令行环境,(gdb)就是命令提示符,此时gdb程序等待用户输入命令。

Ø  gdb命令提示符下输入命令:help,查看帮助信息。输入q,退出帮助信息页。

Ø  gdb命令提示符下输入命令:list  1,从第一行开始列出源代码。可以看到一次只列出10行,如果需要继续列出下面的代码,可以输入list命令,或者输入回车,回车表示重复上一条命令。

Ø  gdb命令提示符下输入命令:start,开始执行程序。可以看到gdb停在main函数中变量定义之后的第一条处等待用户输入命令,gdb列出的是即将执行的下一条语句,也就是说此时语句 “ result = add_range(1,10) “ 还未执行。

Ø  gdb命令提示符下输入命令:next,单步运行,控制语句一条一条执行。当执行完打印语句之后,看到了错误的输出结果,但依旧无法得知哪里出错了。

Ø  gdb命令提示符下输入命令:start,重新开始执行程序。此时提示将要执行的语句是 “result = add_range(1,10)” ; 。这次,我们进入函数add_range去调试。

Ø  gdb命令提示符下输入命令:step,进入函数add_range中去跟踪执行。

Ø  gdb命令提示符下输入命令:backtrace,查看函数调用的栈帧。可以看到当前的函数add_range是被main函数调用的,并且可以看到main函数传进来的实参值。最左边显示的数值表示栈帧的帧编号。

Ø  gdb命令提示符下输入命令:info  locals,查看add_range函数的局部变量的值。

Ø  gdb命令提示符下输入命令:frame  1,进入栈帧1,即main函数,输入命令查看main函数的局部变量的值。

Ø  frame  1

Ø  使用stepnext命令执行几条语句后,在gdb命令提示符下输入命令:print  sum,打印变量sum的值。可以看到sum的值不正确,原因是局部变量sum没有初始化,所以具有不确定的值。

Ø  gdb命令提示符下输入命令:start,重新开始执行程序。进入add_range函数,在gdb命令提示符下输入命令:set  var  sum=0,把sum的初始值改为0

Ø  gdb命令提示符下输入命令:finish,执行完当前的函数并返回。可以看到结果正确了。

Ø  gdb命令提示符下输入命令:q,退出gdb

Ø  根据刚才调试的结果修改源代码(源代码截图)Linux软件开发工具

 

2、  使用gdb设置断点调试:

Ø  查看老师提供的findbug.c文件的内容,分析程序的作用。程序的作用是:将用户输入的数字字符串转化为数值并打印出来。提示:Ctrl+c 可停止程序的执行。

Ø  使用gcc程序编译运行findbug.c,观察程序运行的结果。(注意使用选项-g,以便于gdb调试)。提示:输入两次数字字符串或者输入5个以上的数字字符,可以看到程序错误的输出结果。

Ø  ./findbug

Ø  3344         

Ø  input=3344

Ø  43434

Ø  input=-950532999

Ø  345345

Ø  input=-901475055

Ø  4545

Ø  input=385808849

Ø  4545

Ø  input=1207862737

Ø  aefaef

Ø  input=5489387

Ø  242626556254   

Ø  input=-1598692335

Ø  sasgagsegeghase

Ø  input=1411102243

Ø  使用gdb调试分析程序,并修改源代码,以得到正确的结果。提示:1.跟踪观察变量sumdisplay  sum2.设置断点break  9;使用continue命令连续运行程序。

Ø   

Ø  根据刚才调试的结果修改源代码(源代码截图)。

Ø  Linux软件开发工具

 

3、  项目管理工具make的使用:

Ø  查看老师提供的f1.cf2.cf3.c文件的内容,分析程序的作用。

Ø  按以下步骤编译运行程序:

n  gcc  f1.c  -c  -o  f1.o

n  gcc  f2.c  -c  -o  f2.o

n  gcc  f3.c  -c  -o  f3.o

n  gcc  f1.o  f2.o  f3.o  -o  f

Ø  从以上过程可以看出各文件之间的依赖关系如下图所示:

Linux软件开发工具

Ø  使用vi创建编辑make配置文件Makefile,内容如下所示:(注意2\4\6\8行开头的必须是[tab])。

Ø  删除刚才生成的.o文件和最终的可执行文件frm  *.o  &&  rm  f

Ø  rm  *.o  &&  rm  f

Ø  输入命令make,可以看到make工具根据Makefile文件执行了2\4\6\8行的命令。

Ø  zsc@zsc-desktop:~/make$ make

Ø  gcc f1.c -c -o f1.o

Ø  gcc f2.c -c -o f2.o

Ø  gcc f3.c -c -o f3.o

Ø  gcc f1.o f2.o f3.o -o f

Ø  随意修改一下f1.c文件,重新执行make,观察输出。(此时执行了哪几行命令?为什么其它几行并没有执行?)

Ø  此时执行了哪几行命令 2和第8

Ø  gcc f1.c -c -o f1.o

Ø  gcc f1.o f2.o f3.o -o f

Ø  为什么其它几行并没有执行

Ø  因为make会自动选择那些受影响的源文件重新编译,而不受影响的源文件则不重新编译

Ø  Makefile修改成如下格式,删除 .o f文件,重新make

 

Ø  Makefile修改成如下格式,删除 .o f文件,重新make

 

 

 

 

 

版权所有:《曾巧文博客-关注互联网IT技术,记录生活点滴》 => 《【Linux学习】实验12_Linux软件开发工具(2)
本文地址://qiaowen.net/post-1229.html
除非注明,文章均为 《曾巧文博客-关注互联网IT技术,记录生活点滴》 原创,欢迎转载!转载请注明本文地址,谢谢。

有 4848 人浏览,获得评论 2 条

评论:

阿里超
2012-10-15 18:27
看来是同行啊,本科做的毕业设计是单片机的。我最近做研究生毕业设计,是ARM+DSP的,需要在linux环境下编写代码,正好来你这儿学习学习。
曾巧文
2012-10-19 12:51
@阿里超:呵呵,到了你的博客去看了,很有意思。常交流

发表评论:

Powered by emlog 粤ICP备12040901号

>>本作品采用-知识共享署名-非商业-禁止演绎-协议-进行许可 |站点地图 | | | | 开放分类目录 |