




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《嵌入式系統(tǒng)應(yīng)用》實(shí)驗(yàn)?zāi)0鍖?shí)驗(yàn)一Linux下C語(yǔ)言編程入門實(shí)驗(yàn)?zāi)康?.掌握在Linux下利用gcc編譯器編譯C語(yǔ)言程序。2.掌握利用Gdb調(diào)試器對(duì)C語(yǔ)言程序進(jìn)行調(diào)試。2.掌握makefile文件編寫(xiě)方法,對(duì)C語(yǔ)言程序進(jìn)行編譯。二、實(shí)驗(yàn)環(huán)境1.PC機(jī)2.虛擬機(jī)軟件:VMware3.Ubuntu10.04Linux操作系統(tǒng)(安裝在虛擬機(jī)上)三、實(shí)驗(yàn)內(nèi)容1.利用gcc編譯器編譯C語(yǔ)言程序(1)利用gcc編輯C語(yǔ)言程序啟動(dòng)虛擬機(jī),輸入密碼:1,打開(kāi)終端,輸入:gedithello.c,從而打開(kāi)了gedit編輯器:在gedit編輯器中輸入hello.c的源代碼(書(shū)p53):#include<stdio.h>main(){printf("helloworld!\n");}再回到終端界面。預(yù)處理(p53)輸入:gcc–Ehello.c–ohello.i實(shí)驗(yàn)要求:在終端輸入:ls,顯示畫(huà)面:在gedit中讀取hello.i的內(nèi)容,并顯示畫(huà)面:?jiǎn)枺侯A(yù)處理的作用是什么?編譯(p53)輸入:gcc–Shello.i–ohello.s實(shí)驗(yàn)要求:(1)在終端輸入:ls,顯示畫(huà)面:(2)在gedit中讀取hello.s的內(nèi)容,并顯示畫(huà)面:(3)問(wèn):編譯的作用是什么?匯編(p54)輸入:gcc–chello.s–ohello.o實(shí)驗(yàn)要求:(1)在終端輸入:ls,顯示畫(huà)面:(2)問(wèn):匯編的作用是什么?鏈接和運(yùn)行(p55)輸入:gcchello.o–ohello實(shí)驗(yàn)要求:(1)在終端輸入:ls,顯示畫(huà)面:(2)問(wèn):鏈接的作用是什么?(3)運(yùn)行可執(zhí)行文件:hello,(命令:./hello)顯示結(jié)果畫(huà)面:2.利用Gdb調(diào)試器對(duì)C語(yǔ)言程序進(jìn)行調(diào)試(1)gdb基本操作在命令行上鍵入gdb并按回車鍵,顯示出現(xiàn)的畫(huà)面:下表列出了利用GDB調(diào)試時(shí)會(huì)用到的一些命令。命令 命令描述break 在代碼里設(shè)置斷點(diǎn),這將使程序執(zhí)行到這里時(shí)被掛起file 裝入想要調(diào)試的司可執(zhí)行文件kill 終止正在調(diào)試的程序list 列出產(chǎn)生執(zhí)行文件的源代碼的——部分make 使在退出gdb時(shí)就可以重新產(chǎn)生可執(zhí)行文件next 執(zhí)行—行源代碼但小進(jìn)入函數(shù)內(nèi)部print 顯示表達(dá)式的值quit 終止gdbrub 執(zhí)行當(dāng)前被調(diào)試的程序shell 使能不離開(kāi)gdb就執(zhí)行shell命令step 執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部watch 監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變(2)利用gdb調(diào)試C語(yǔ)言程序[1](p30-31)調(diào)試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; } 實(shí)驗(yàn)要求:(1)對(duì)test.c這個(gè)源程序進(jìn)行編譯,編譯和執(zhí)行命令如下:gcc–g–otesttest.c./test顯示結(jié)果畫(huà)面:(2)在GDB命令輸入行輸入以下命令來(lái)調(diào)試該程序:#gdbtest再輸入:list,顯示畫(huà)面:(3)接下來(lái)要對(duì)程序中可能會(huì)出錯(cuò)的地方設(shè)置斷點(diǎn),設(shè)置斷點(diǎn)的方法如下,斷點(diǎn)設(shè)置在第16行,然后用run命令運(yùn)行程序,顯示結(jié)果畫(huà)面:(gdb)break16(gdb)run(4)繼續(xù)調(diào)試程序:1)現(xiàn)在我們來(lái)看看到底str2的內(nèi)容與str1的有何不同,顯示結(jié)果畫(huà)面:(gdb)printstr1(gdb)pstr22)上面我們用print命令(也可以簡(jiǎn)寫(xiě)成p)來(lái)分別顯示str1字符串和str2字符串的內(nèi)容,可以發(fā)現(xiàn):str1字符串在最后一個(gè)字母d后面是字符串結(jié)束符0(用\000表示的),而str2的d后面仍然是*,這是因?yàn)槌绦蛏購(gòu)?fù)制了一個(gè)字符所致。下面用next單步執(zhí)行命令查看程序輸出結(jié)果,再用continue命令繼續(xù)運(yùn)行直到程序結(jié)束再退出GDB,顯示結(jié)果畫(huà)面:(gdb)next(gdb)n(gdb)continue(gdb)quit3)現(xiàn)在我們發(fā)現(xiàn)了程序的問(wèn)題所在,將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;}重新編譯運(yùn)行,顯示結(jié)果畫(huà)面。*[2]采用同樣的方法調(diào)試p58)的test1.c程序,調(diào)試過(guò)程見(jiàn)p58-61),顯示調(diào)試過(guò)程中的各個(gè)結(jié)果畫(huà)面:
/*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對(duì)test.c進(jìn)行編譯,注意一定要加上選項(xiàng)“-g”,這樣編譯出的可執(zhí)行代碼中才包含調(diào)試信息,否則之后Gdb無(wú)法載入該可執(zhí)行文件。#gcc-gtest.c-otest雖然這段程序沒(méi)有錯(cuò)誤,但調(diào)試完全正確的程序可以更加了解Gdb的使用流程。接下來(lái)就啟動(dòng)Gdb進(jìn)行調(diào)試。注意,Gdb進(jìn)行調(diào)試的是可執(zhí)行文件,而不是如“.c”的源代碼,因此,需要先通過(guò)Gcc編譯生成可執(zhí)行文件才能用Gdb進(jìn)行調(diào)試。#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的啟動(dòng)畫(huà)面中指出了Gdb的版本號(hào)、使用的庫(kù)文件等信息,接下來(lái)就進(jìn)入了由“(gdb)”開(kāi)頭的命令行界面了。<1>查看文件在Gdb中鍵入“l(fā)”(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列出的源代碼中明確地給出了對(duì)應(yīng)的行號(hào),這樣可以大大地方便代碼的定位。<2>設(shè)置斷點(diǎn)設(shè)置斷點(diǎn)是調(diào)試程序中是一個(gè)非常重要的手段,它可以使程序到一定位置暫停它的運(yùn)行。因此,程序員在該位置處可以方便地查看變量的值、堆棧情況等,從而找出代碼的癥結(jié)所在。在Gdb中設(shè)置斷點(diǎn)非常簡(jiǎn)單,只需在“b”后加入對(duì)應(yīng)的行號(hào)即可(這是最常用的方式,另外還有其他方式設(shè)置斷點(diǎn))。如下所示:(Gdb)b6Breakpoint1at0x804846d:filetest.c,line6.要注意的是,在Gdb中利用行號(hào)設(shè)置斷點(diǎn)是指代碼運(yùn)行到對(duì)應(yīng)行之前將其停止,如上例中,代碼運(yùn)行到第6行之前暫停(并沒(méi)有運(yùn)行第6行)。<3>查看斷點(diǎn)情況在設(shè)置完斷點(diǎn)之后,用戶可以鍵入“infob”來(lái)查看設(shè)置斷點(diǎn)情況,在Gdb中可以設(shè)置多個(gè)斷點(diǎn)。(Gdb)infobNumTypeDispEnbAddressWhat1breakpointkeepy0x0804846dinmainattest.c:6<4>運(yùn)行代碼接下來(lái)就可運(yùn)行代碼了,Gdb默認(rèn)從首行開(kāi)始運(yùn)行代碼,可鍵入“r”(run)即可(若想從程序中指定行開(kāi)始運(yùn)行,可在r后面加上行號(hào))。(Gdb)rStartingprogram:/root/workplace/Gdb/testReadingsymbolsfromsharedobjectreadfromtargetmemory...done.LoadedsystemsuppliedDSOat0x5fb000Breakpoint1,main()attest.c:66sum(50);可以看到,程序運(yùn)行到斷點(diǎn)處就停止了。<5>查看變量值在程序停止運(yùn)行之后,程序員所要做的工作是查看斷點(diǎn)處的相關(guān)變量值。在Gdb中只需鍵入“p”+變量值即可,如下所示:(Gdb)pn$1=0(Gdb)pi$2=134518440在此處,為什么變量“i”的值為如此奇怪的一個(gè)數(shù)字呢?原因就在于程序是在斷點(diǎn)設(shè)置的對(duì)應(yīng)行之前停止的,那么在此時(shí),并沒(méi)有把“i”的數(shù)值賦為零,而只是一個(gè)隨機(jī)的數(shù)字。但變量“n”是在第四行賦值的,故在此時(shí)已經(jīng)為零。<6>單步運(yùn)行單步運(yùn)行可以使用命令“n”(next)或“s”(step),它們之間的區(qū)別在于:若有函數(shù)調(diào)用的時(shí)候,“s”會(huì)進(jìn)入該函數(shù)而“n”不會(huì)進(jìn)入該函數(shù)。因此,“s”就類似于VC等工具中的stepin”,“n”類似與VC等工具中的“stepover”。它們的使用如下所示:(gdb)nThesumof1-mis12757 for(i=1;i<=50;i++)(gdb)s8 n+=i;可見(jiàn),使用“n”后,程序顯示函數(shù)sum的運(yùn)行結(jié)果并向下執(zhí)行,而使用“s”后則進(jìn)入到sum函數(shù)之中單步運(yùn)行。<7>恢復(fù)程序運(yùn)行在查看完所需變量及堆棧情況后,就可以使用命令“c”(continue)恢復(fù)程序的正常運(yùn)行了。這時(shí),它會(huì)把剩余還未執(zhí)行的程序執(zhí)行完,并顯示剩余程序中的執(zhí)行結(jié)果。以下是之前使用“n”命令恢復(fù)后的執(zhí)行結(jié)果:(Gdb)cContinuing.Thesumof1-50is:1275Programexitedwithcode031.可以看出,程序在運(yùn)行完后退出,之后程序處于“停止?fàn)顟B(tài)”。Makefile文件編寫(xiě)入門[1]Makefile基本結(jié)構(gòu)Makefile是Make讀入的惟一配置文件,因此本節(jié)的內(nèi)容實(shí)際就是講述Makefile的編寫(xiě)規(guī)則。在一個(gè)Makefile中通常包含如下內(nèi)容:需要由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件要?jiǎng)?chuàng)建的目標(biāo)體所依賴的文件(dependency_file)創(chuàng)建每個(gè)目標(biāo)體時(shí)需要運(yùn)行的命令(command)它的格式為:target:dependency_filescommand例如,有兩個(gè)文件分別為hello.c和hello.h,創(chuàng)建的目標(biāo)體為hello.o,執(zhí)行的命令為gcc編譯指令:gcc–chello.c,那么,對(duì)應(yīng)的Makefile就可以寫(xiě)為:#Thesimplestexamplehello.o:hello.chello.hgcc–chello.c–ohello.o接著就可以使用make了。使用make的格式為:maketarget,這樣make就會(huì)自動(dòng)讀入Makefile(也可以是首字母小寫(xiě)makefile)并執(zhí)行對(duì)應(yīng)target的command語(yǔ)句,并會(huì)找到相應(yīng)的依賴文件。如下:[davinci@davinci-desktop]#makehel
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 墩、臺(tái)身和蓋梁工程現(xiàn)場(chǎng)質(zhì)量檢驗(yàn)報(bào)告單(五)
- 智能交通管理平臺(tái)開(kāi)發(fā)協(xié)議
- 辦公用品采購(gòu)預(yù)算與實(shí)際使用對(duì)比表格
- 專業(yè)資料出版合作協(xié)議
- 水利水電工程施工承包協(xié)議
- 企業(yè)品牌授權(quán)使用協(xié)議書(shū)
- 小學(xué)生體育運(yùn)動(dòng)啟蒙故事讀后感
- 太陽(yáng)能光伏系統(tǒng)安裝維護(hù)合同
- 2024-2025學(xué)年高二數(shù)學(xué)湘教版選擇性必修第二冊(cè)教學(xué)課件 第2章-2.4空間向量在立體幾何中的應(yīng)用-2.4.3 向量與夾角
- 水系統(tǒng)基礎(chǔ)知識(shí)培訓(xùn)課件
- 《酒店前廳設(shè)計(jì)》課件
- 老年醫(yī)學(xué)科建設(shè)與發(fā)展
- 2025年貴州能礦錳業(yè)集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 公司積分制管理實(shí)施方案
- 2024年湖南科技職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 《性病防治知識(shí)講座》課件
- 定額〔2025〕2號(hào)文-關(guān)于發(fā)布2020版電網(wǎng)技術(shù)改造及檢修工程概預(yù)算定額2024年下半年價(jià)格
- 2024年河南省中職對(duì)口升學(xué)高考語(yǔ)文試題真題(原卷版)
- 《無(wú)線局域網(wǎng)組建》課件-0無(wú)線課程概述
- 拉薩市2025屆高三第一次聯(lián)考(一模)語(yǔ)文試卷(含答案解析)
- 2024解析:第八章牛頓第一定律、二力平衡-講核心(解析版)
評(píng)論
0/150
提交評(píng)論