版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《嵌入式系统应用》实验模板实验一Linux下C语言编程入门实验目的1.掌握在Linux下利用gcc编译器编译C语言程序。2.掌握利用Gdb调试器对C语言程序进行调试。2.掌握makefile文件编写方法,对C语言程序进行编译。二、实验环境1.PC机2.虚拟机软件:VMware3.Ubuntu10.04Linux操作系统(安装在虚拟机上)三、实验内容1.利用gcc编译器编译C语言程序(1)利用gcc编辑C语言程序启动虚拟机,输入密码:1,打开终端,输入:gedithello.c,从而打开了gedit编辑器:在gedit编辑器中输入hello.c的源代码(书p53):#include<stdio.h>main(){printf("helloworld!\n");}再回到终端界面。预处理(p53)输入:gcc–Ehello.c–ohello.i实验要求:在终端输入:ls,显示画面:在gedit中读取hello.i的内容,并显示画面:问:预处理的作用是什么?编译(p53)输入:gcc–Shello.i–ohello.s实验要求:(1)在终端输入:ls,显示画面:(2)在gedit中读取hello.s的内容,并显示画面:(3)问:编译的作用是什么?汇编(p54)输入:gcc–chello.s–ohello.o实验要求:(1)在终端输入:ls,显示画面:(2)问:汇编的作用是什么?链接和运行(p55)输入:gcchello.o–ohello实验要求:(1)在终端输入:ls,显示画面:(2)问:链接的作用是什么?(3)运行可执行文件:hello,(命令:./hello)显示结果画面:2.利用Gdb调试器对C语言程序进行调试(1)gdb基本操作在命令行上键入gdb并按回车键,显示出现的画面:下表列出了利用GDB调试时会用到的一些命令。命令 命令描述break 在代码里设置断点,这将使程序执行到这里时被挂起file 装入想要调试的司可执行文件kill 终止正在调试的程序list 列出产生执行文件的源代码的——部分make 使在退出gdb时就可以重新产生可执行文件next 执行—行源代码但小进入函数内部print 显示表达式的值quit 终止gdbrub 执行当前被调试的程序shell 使能不离开gdb就执行shell命令step 执行一行源代码而且进入函数内部watch 监视一个变量的值而不管它何时被改变(2)利用gdb调试C语言程序[1](p30-31)调试test.c在gedit中输入以下程序代码:#include<stdio.h>intmain(){ charstr1[16]="Hello,world"; charstr2[16]; inti=0; for(i=0;i<16;i++) str2[i]='*'; str2[15]=0; i=0; while(str1[i]!='\0') { str2[i]=str1[i]; i++; } printf("Thestring1is:%s.\n",str1); printf("Thestring2is:%s.\n",str2); return0; } 实验要求:(1)对test.c这个源程序进行编译,编译和执行命令如下:gcc–g–otesttest.c./test显示结果画面:(2)在GDB命令输入行输入以下命令来调试该程序:#gdbtest再输入:list,显示画面:(3)接下来要对程序中可能会出错的地方设置断点,设置断点的方法如下,断点设置在第16行,然后用run命令运行程序,显示结果画面:(gdb)break16(gdb)run(4)继续调试程序:1)现在我们来看看到底str2的内容与str1的有何不同,显示结果画面:(gdb)printstr1(gdb)pstr22)上面我们用print命令(也可以简写成p)来分别显示str1字符串和str2字符串的内容,可以发现:str1字符串在最后一个字母d后面是字符串结束符0(用\000表示的),而str2的d后面仍然是*,这是因为程序少复制了一个字符所致。下面用next单步执行命令查看程序输出结果,再用continue命令继续运行直到程序结束再退出GDB,显示结果画面:(gdb)next(gdb)n(gdb)continue(gdb)quit3)现在我们发现了程序的问题所在,将test.c的第11行和第15行修改一下:#include<stdio.h>intmain(){charstr1[]="Hello,world";charstr2[11]="";inti=0;do{str2[i]=str1[i];i++;}while(str1[i-1]!='\0');printf("Thestring1is:%s.\n",str1);printf("Thestring2is:%s.\n",str2);return0;}重新编译运行,显示结果画面。*[2]采用同样的方法调试p58)的test1.c程序,调试过程见p58-61),显示调试过程中的各个结果画面:
/*test.c*/#include<stdio.h>intsum(intm);intmain(){inti,n=0;sum(50);for(i=1;i<=50;i++)n+=i;printf("Thesumof1-50is%d\n",n);}intsum(intm){inti,n=0;for(i=1;i<=m;i++)n+=i;printf("Thesumof1-mis%d\n",n);}*参考资料:在保存退出后首先使用Gcc对test.c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb无法载入该可执行文件。#gcc-gtest.c-otest虽然这段程序没有错误,但调试完全正确的程序可以更加了解Gdb的使用流程。接下来就启动Gdb进行调试。注意,Gdb进行调试的是可执行文件,而不是如“.c”的源代码,因此,需要先通过Gcc编译生成可执行文件才能用Gdb进行调试。#gdbtestGNUgdb6.8-debianCopyright(C)2008FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater</licenses/gpl.html>Thisisfreesoftware:youarefreetochangeandredistributeit.ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"and"showwarranty"fordetails.ThisGDBwasconfiguredas"i486-linux-gnu".(gdb)可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。<1>查看文件在Gdb中键入“l”(list)就可以查看所载入的文件,如下所示:(Gdb)l1#include<stdio.h>2intsum(intm);3intmain()4{5 inti,n=0;6 sum(50);7 for(i=1;i<=50;i++)8 {9 n+=i;10 }(Gdb)l11 printf("Thesumof1~50is%d\n",n);1213}14intsum(intm)15{16 inti,n=0;17 for(i=1;i<=m;i++)18 n+=i;19 printf("Thesumof1~mis=%d\n",n);20}可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样可以大大地方便代码的定位。<2>设置断点设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。在Gdb中设置断点非常简单,只需在“b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示:(Gdb)b6Breakpoint1at0x804846d:filetest.c,line6.要注意的是,在Gdb中利用行号设置断点是指代码运行到对应行之前将其停止,如上例中,代码运行到第6行之前暂停(并没有运行第6行)。<3>查看断点情况在设置完断点之后,用户可以键入“infob”来查看设置断点情况,在Gdb中可以设置多个断点。(Gdb)infobNumTypeDispEnbAddressWhat1breakpointkeepy0x0804846dinmainattest.c:6<4>运行代码接下来就可运行代码了,Gdb默认从首行开始运行代码,可键入“r”(run)即可(若想从程序中指定行开始运行,可在r后面加上行号)。(Gdb)rStartingprogram:/root/workplace/Gdb/testReadingsymbolsfromsharedobjectreadfromtargetmemory...done.LoadedsystemsuppliedDSOat0x5fb000Breakpoint1,main()attest.c:66sum(50);可以看到,程序运行到断点处就停止了。<5>查看变量值在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在Gdb中只需键入“p”+变量值即可,如下所示:(Gdb)pn$1=0(Gdb)pi$2=134518440在此处,为什么变量“i”的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没有把“i”的数值赋为零,而只是一个随机的数字。但变量“n”是在第四行赋值的,故在此时已经为零。<6>单步运行单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别在于:若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。因此,“s”就类似于VC等工具中的stepin”,“n”类似与VC等工具中的“stepover”。它们的使用如下所示:(gdb)nThesumof1-mis12757 for(i=1;i<=50;i++)(gdb)s8 n+=i;可见,使用“n”后,程序显示函数sum的运行结果并向下执行,而使用“s”后则进入到sum函数之中单步运行。<7>恢复程序运行在查看完所需变量及堆栈情况后,就可以使用命令“c”(continue)恢复程序的正常运行了。这时,它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。以下是之前使用“n”命令恢复后的执行结果:(Gdb)cContinuing.Thesumof1-50is:1275Programexitedwithcode031.可以看出,程序在运行完后退出,之后程序处于“停止状态”。Makefile文件编写入门[1]Makefile基本结构Makefile是Make读入的惟一配置文件,因此本节的内容实际就是讲述Makefile的编写规则。在一个Makefile中通常包含如下内容:需要由make工具创建的目标体(target),通常是目标文件或可执行文件要创建的目标体所依赖的文件(dependency_file)创建每个目标体时需要运行的命令(command)它的格式为:target:dependency_filescommand例如,有两个文件分别为hello.c和hello.h,创建的目标体为hello.o,执行的命令为gcc编译指令:gcc–chello.c,那么,对应的Makefile就可以写为:#Thesimplestexamplehello.o:hello.chello.hgcc–chello.c–ohello.o接着就可以使用make了。使用make的格式为:maketarget,这样make就会自动读入Makefile(也可以是首字母小写makefile)并执行对应target的command语句,并会找到相应的依赖文件。如下:[davinci@davinci-desktop]#makehel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024离婚双方的共同债权债务处理合同
- 2024苗木种植与园林苗木种植基地规划与建设劳务分包协议3篇
- 2024版活动场地使用合同范本
- 2025年度生态农业园承包合同格式规范4篇
- 2024镍矿国际贸易法律事务咨询服务合同3篇
- 2025年度新能源车辆代理记账与补贴申请合同4篇
- 2025年度文化产业发展总经理聘用协议3篇
- 《蒸汽锅炉维护与管理》课件
- 2025年度个人二手房交易反担保合同规范4篇
- 2025年度博物馆展览馆日常保洁与文物保护合同4篇
- 2024年桂林中考物理试卷
- DL∕T 5362-2018 水工沥青混凝土试验规程
- (正式版)JC∕T 60023-2024 石膏条板应用技术规程
- DL-T5054-2016火力发电厂汽水管道设计规范
- (权变)领导行为理论
- 2024届上海市浦东新区高三二模英语卷
- 家用电器可靠性与寿命预测研究
- 中考语文二轮复习:诗歌鉴赏系列之边塞军旅诗(知识点+方法+习题)
- 2024年智慧工地相关知识考试试题及答案
- 五年级上册脱式计算练习300题及答案
- 健康产业园策划方案
评论
0/150
提交评论