实验一-LinuxC编程工具GCC和GDB

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

淮海工学院计算机工程学院实验报告书课程名:《Linux程序设计》题目:实验一LinuxC编程工具:GCC和GDB班级:软件131学号:2013122870姓名:王裕评语:成绩:指导教师:批阅时间:年月日《Linux程序设计》实验报告-1-一、实验目的与要求1.掌握LinuxC开发过程中的基本概念;2.掌握如GCC,GDB等开发工具的使用。二、实验内容1.将参考代码录入到test1.c文件中,编译执行后发现结果与预期不一致,请使用GDB调试,完成字符串反序输出功能。三、参考源代码#includestdio.h#includestdlib.h#includestring.hintreverse_str(char*string);intmain(void){charstring[]=LinuxCTools:GCCandGDB;printf(Theoriginalstringis%s\n,string);reverse_str(string);}intreverse_str(char*str){char*new_str;inti,size;size=strlen(str);if((new_str=(char*)malloc(size+1))==NULL){return-1;}for(i=0;isize;i++)new_str[size-i]=str[i];new_str[size+1]='';printf(Thereversedstringis%s\n,new_str);free(new_str);return0;}四、实验步骤步骤1.编辑源代码test1.cmkdirtest1cdtest1《Linux程序设计》实验报告-2-gedittest1.c(1)使用gedit编辑器,建议课外学习vim;(2)分析代码中语句功能。步骤2.编译源代码test1.cgcctest1.c-otest1-g(1)复习gcc常用选项;(2)帮助学生排查编译时错误。(3)分析输出结果步骤3.调试test1gdbtest1(1)回顾调试的基本方法:跟踪语句执行过程,观察执行结果;(2)设置断点的三种基本方法:①bline_number②bline_numberifcondition_expression③bfunction_name(3)查看中间输出结果:①pvar②setprintelement0parray_name或pointer说明:GDB中查看字符串变量值可通过“setprintelement0”命令,一次性显示字符串所有内容。(4)分析中间结果,修改28行语句为new_str[size-i-1]=str[i];五、实验结果与截图1.编写test1.c文件并编译《Linux程序设计》实验报告-3-2.设置断点,进行gdb测试跟踪变量。执行到i=27时size-i=0,str[27]已经超过str字符串限制,于是new_str[0]=’\0’。输出new_str时,由于超过限制无法输出。所以修改程序第28行语句为new_str[size-i-1]=str[i];正确的程序运行结果如下图所示。《Linux程序设计》实验报告-4-六、思考题1.分析以下代码,完成指定范围内数值累加功能:#includestdio.h/*函数功能:将low到high之间的数值累加求和*/intadd_range(intlow,inthigh){inti,sum;for(i=low;i=high;i++)sum=sum+i;returnsum;}intmain(void){intresult[2];result[0]=add_range(1,10);result[1]=add_range(1,100);printf(result[0]=%d\nresult[1]=%d\n,result[0],result[1]);return0;}答:进行累加时,局部变量sum的值会被内存保存下来,会导致数值错误,要对其初始化为0。把inti,sum;改为inti;intsum=0;2.结构化编程经常将相近功能编译成库形式,方便调用。请查阅资料,使用GCC将一组功能相关的源文件编译成静态库或动态库?建立库文件的源文件print1.c和print2.c如下所示:/*print1.c*/#includestdio.hvoidprint1(intarg){printf(%d\n,arg);}/*print2.c*/#includestdio.hvoidprint2(char*arg){printf(%s\n,arg);《Linux程序设计》实验报告-5-}调用库函数的源文件为main.c如下:/*main.c*/voidprint1(intarg);voidprint2(char*arg);intmain(intargc,char*argv[]){inti=3;char*str=testlibary!\n;print1(i);print2(str);return0;}生成静态库(myprint.a)并使用的基本步骤步骤1:编译print1.c,print2.c生成print1.o,print2.o目标文件gcc-cprint1.cprint2.c步骤2:生成myprint静态库文件libmyprint.aar-rlibmyprint.aprint1.oprint2.o步骤3:拷贝库文件libmyprint.a到/usr/lib目录下sudocplibmyprint.a/usr/lib说明:若不将静态链接库拷贝到/usr/lib目录下,在调用该库时需通过GCC选项-L指定库文件所在路径步骤4:调用静态库文件,编译生成可执行二进制文件gcc-omainmain.c-lmyprint生成动态链接库(myprint.so)并使用的基本步骤步骤1:编译print1.c,print2.c生成print1.o,print2.o目标文件gcc-c-fpicprint1.cprint2.c注意:GCC选项“-fpic”表示独立编址,运行时可计算出相应的内部地址。步骤2:生成myprint动态链接库libmyprint.sogcc–sharedprint1.oprint2.o-olibmyprint.so步骤3:拷贝库文件libmyprint.so到/usr/lib目录下sudocplibmyprint.so/usr/lib步骤4:调用动态库文件,编译生成可执行二进制文件gcc-omainmain.clibmyprint.so七、实验体会本次实验是Linux的第一次实验,换了一个环境,很不适应,没有鼠标操作的情况下,可以通过上下键来选择vim,gcc等操作,也极为方便了我们的操作,再有就是gdb,语言代码除了符合最基本的语法规范之外还必须符合设计者的逻辑意图,如果发现生成的可执行文件运行结果不正确,则可以通过相应的调试环境来跟踪调试,因此需要用到gdb。比如,用来查看文件,设置断点,运行程序,查看变量,表达式的值等等,其中的step,next等很是重要:单步执行:step、next,step命令步入函数,而next命令步过函数。stepup将一直执行,直至当前函数将控制返回调用它的函数为止。另外常见的gdb命令还有《Linux程序设计》实验报告-6-file,kill,list,run,quit,make等

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功