實驗五常用軟件開發(fā)工具_第1頁
實驗五常用軟件開發(fā)工具_第2頁
實驗五常用軟件開發(fā)工具_第3頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、實驗五、常用軟件開發(fā)工具一、實驗目的1、 熟悉字符模式下的 C程序編譯和調(diào)試環(huán)境,基本掌握Linux字符模式下的編譯工具和調(diào)試工具的使用;2、 本實驗需要綜合使用Linux基本文件命令、編輯器的使用,練習在 Linux的字符模式下,編輯、編譯及調(diào)試一個C程序的基本方法。二、實驗內(nèi)容和步驟1 gcc和g+語言編譯器GCC是GNU Compiler Collection 的縮寫,它是世界上最為重要的開放源代碼軟件18。因為所有其他的開放源代碼項目都依賴于GCC進行編譯。比如,沒有 GCC Linux的產(chǎn)生就不會成為可能。GCC能工作在很多平臺上,這里所說的平臺是指計算機硬件芯片和運行在其上的操作系

2、統(tǒng)的組合。下表是GCC1行的平臺。表GCC運行的平臺硬件操作系統(tǒng)AlphaRed Hat Li nux 7.1HPPAHPUX 11.0In tel x86Debia n Li nux 2.2, Red Hat Li nux 6.2,FreeBSD 4.5MIPSIRIX 6.5PowerPCSparcSolaris 2.7GCC可以編譯多種語言:C, C+,對象C (標準C的派生),F(xiàn)ortran , Java, Ada。正如GCC縮寫所代表的對象一樣,GCC實際上是多種編譯器的統(tǒng)稱,gcc是所有編譯器的統(tǒng)一的程序接口,在本書中,并沒有區(qū)分GCC和gcc。同時,GCC也能夠進行代碼優(yōu)化,提高

3、執(zhí)行程序的運行速度。g+是構建于gcc基礎上的C+語言編譯器。gcc編譯過程分為4個階段:l預處理l編譯l匯編 l連接 最簡單的C語言編譯的例子:用vi建立一個hello.c文件$vi hellox輸入字符i,插入文本以下文本#include int main(void)printf (” Hello World!n); return 0;最后輸入字符:wq,返回命令行,鍵入以下編譯命令$gcc hello.c (-lstdc+)如果沒有錯誤gcc將生成默認的可執(zhí)行文件a.out ,執(zhí)行a.out:$./a.outHello World!$gcc帶有多達數(shù)頁的編譯選項,我們僅列出最常用的幾項:

4、-o可執(zhí)行文件名指定輸出的可執(zhí)行文件名,而不是默認的-c只編譯生成.o的目標文件,不連接生成可執(zhí)行文件-s只編譯生成.s的匯編文件,不連接生成可執(zhí)行文件-g在可執(zhí)行文件中加入標準調(diào)試信息-Wall允許GCC發(fā)出警告型錯誤信息選項使用的例子:對以上hello.c使用-o,-g常用選項重新編譯、執(zhí)行:$gcc -g hello.c -o hello$./helloHello World!$GCC默認的擴展文件名:.c C語言源代碼.C .cc C+語言源代碼.i預處理后的C語言源代碼.ii預處理后的C+語言源代碼.S .s匯編語言源代碼.o編譯后的目標代碼.a.so編譯后的庫代碼下面的例子由兩個文

5、件組成:mai n.c, calc.c ,其中,mai n.c#indude int calc(int);int main(int argcT char* argv)int iIn put=O, iOutput=0;int i=0;scan f(%i, & iI nput);while(il nput 0)prin tf(Please in put a positive in teger!n); scan f(%i, &iI nput);iOutput = calc(i In put);prin tf(Result is:%in, iOutput); return 0;a.out文件內(nèi)容為:c

6、alc.c的文件內(nèi)容為:#i n elude int calc(i nt iln) Iint i = 0, iOut = 0;iOut = iln;for(i = 0; i iln; i+)iOut += iOut * il n;return iOut;I1、編譯過程有三種方式編譯這兩個源程序,一是直接使用如下命令行完成編譯、鏈接過程:$gcc mai n.c calc.c -o main命令行中,ma in .c calc.c的后綴名指明了調(diào)用c編譯器,前面講到了gcc是GCC的眾多編譯器的統(tǒng)一入口,gcc靠后綴名決定調(diào)用什么編譯器,-o參數(shù)指定了可執(zhí)行文件的文件名為main。第二種方法是編

7、譯 calc.c為靜態(tài)庫,編譯 ma in .c時指定靜態(tài)庫的位置。需要將calc.c編譯成中間文件calc.o,使用如下命令行:$gcc -c calc.c生成靜態(tài)庫文件,添加calc.o到靜態(tài)庫中,使用如下命令行:$ar -r libcalc.a calc.o命令行中,-r libcalc.a參數(shù)表示建立靜態(tài)庫,名字為libcalc.a。接下來,使用如下命令行:$gcc mai n.c libcalc.a -o main上面這條命令也可以用下面的命令完成:$gcc mai n.c -lcalc o main-l參數(shù)可以指定庫名稱,這里calc表示使用庫libcalc.a,庫名字前面的lib

8、和后面 的.a被省略掉了,遵從了命名法。第三種方法是建立共享庫,編譯時指定共享庫。首先,編譯calc.c為calc.o,使用命令行:$gcc -c -fpic calc.c命令行中,-fpic指定calc.o為可重分配地址屬性,pic是position independenee code的縮寫。接下來使用 calc.o生成共享庫 calc.so :$gcc -shared calc.o-o calc.so這兩條命令也可以縮減為一行:$gcc -shared -fpic calc.c -o calc.so最后編譯main.c ,鏈接生成的共享庫$gcc mai n.c calc.so -o ma

9、in2 make項目管理器make項目管理器(GNU中的名稱為gmake )可以根據(jù)項目開發(fā)者說明的項目開 發(fā)文件Makefile自 動的進行編譯配置和重復編譯 ,能實現(xiàn)復雜項目的編譯自動化。項目開發(fā)文件 Makefile的編寫使用以下規(guī)則:目標體1:依賴體1 依賴體2 .命令行1命令行2目標體2 :依賴體1 依賴體2 .命令行1命令行2.其中目標體是命令行要生成的輸出文件,依賴體是命令行要輸入的文件或選項,命令行序列是要創(chuàng)建目標體文件所需要的步驟,例如編譯命令。無特別指定,make總是使用當前目錄中的Makefile進行自動編譯。例如我們在當前目錄中有兩個項目開發(fā)文件hello.c和hell

10、o.h,貝U Makefile文件可以編寫為:hello: hello.ogcc hello.o -o hello hello.o: hello.c hello.h gcc -c hello.c clean:rm hello *.omake命令的使用:$g make輸入 make或make hello將生成 Makefile中所有的目標文件,即hello,hello.o,hello.s。$g make hello.o將僅生成目標文件hello.o$g make clea n是一條偽目標生成命令,該目標沒有依賴體,它只執(zhí)行對已生成目標文件的刪除。當我們對以上依賴體中的任意一個進行了修改,重新ma

11、ke時僅會引發(fā)對應目標體的重新生成,從而提高了編譯的效率并保證了項目開發(fā)的正確性。3 gdb程序調(diào)試器GDB 是 GNU Project Debugger 的縮寫,用于調(diào)試 Ada, C, C+, Objective-C, Pascal 和其他語言編寫的程序20,這些程序可以運行在本地計算機上,也可以運行在遠程計算機上。GDB可以運行在幾乎所有的UNIX和微軟 Windows平臺上。GDB主要能做下面4種事(以及由它們所支持的其他事情):1)啟動程序,指定可能影響程序運行的任何條件;2)指定程序在一定條件下停止;3)檢查當程序停止時發(fā)生的事情;4) 通過改變程序中的某些條件,測試可能造成的軟件

12、錯誤,還可以由此學習其他的軟件錯誤。GDB可以做源代碼級別的程序調(diào)試(需要在編譯時指定相應條件),也可以做二進制級別的程序調(diào)試。可以使用gdb跟蹤調(diào)試,觀察到它的高級語言源代碼的執(zhí)行過程和變量的中間結果,從而能快速的排除程序運行時發(fā)生的錯誤。以下是一個帶有運行時錯誤的C程序,注意程序想通過傳地址方式在一個函數(shù)中為字符變量C賦一個字符,但它引用了一個空指針,這將引發(fā)運行時的段非法錯誤使得程序異常終止。但我們可以通過gdb跟蹤到它產(chǎn)生錯誤的位置,從而分析出產(chǎn)生錯誤的原因。/*I* debugmy.c7#i n elude void myputc(char * cptr)*cptr = a;prin

13、 tf(myputc=%c n,*cptr);int main( void)char c;char * cptr;c = A :myputc(cptr);return 0;使用帶-g選項的gcc編譯、執(zhí)行:$gcc -g debugmy.c -o debugmy$ ./debugmy段錯誤$使用gdb跟蹤查錯$ gdb ./debugmyGNU gdb Red Hat Linux (630.0-1.122rh)Copyright 2004 Free Software Foun dati on, Inc.GDB is free software, covered by the GNU Gen e

14、ral Public Lice n se, and you are welcome to cha nge it an d/or distribute copies of it un der certa in con diti ons.Type show copy in g to see the con diti ons.There is absolutely no warra nty for GDB.Type show warra n ty for details.This GDB was con figured as i386-redhat-l inu x-g nu .Us ing host

15、 libthread_db library /lib/libthread_db.so.1.(gdb)Gdb?,F(xiàn)在進入了gdb調(diào)試狀態(tài),可以使用gdb的調(diào)試 子 命令跟蹤程序的執(zhí)行 用命令:list 行號列出指定行號的上下行(缺省為10行) break 源程序文件名:行號 建立一個斷點run啟動被調(diào)試的程序next從斷點處向下執(zhí)行一行step從斷點處向下執(zhí)行一行,當前行為函數(shù)則跟蹤進入函數(shù)contin ue繼續(xù)從斷點處連續(xù)執(zhí)行print變量名打印變量當前值quit 退出 gdb(gdb)list 10567891011121314讓我們現(xiàn)使用list命令查看一下要調(diào)試的程序是否已經(jīng)裝入,輸入:v

16、oid myputc(char * cptr)*cptr = a;prin tf(myputc=%cn,*cptr);int main( void)char c;char * cptr;c = A:我們將斷點設在第15行上,輸入:(gdb) break 15Breakpoi nt 1 at 0x80483c0: file debugmy.c, li ne 15.開始跟蹤執(zhí)行,輸入:(gdb) runStart ing program: /root/ipc/debugmyRead ing symbols from shared object read from target memory.do ne.Loaded system supplied DSO at OxffffeOOOBreakpo int 1, mai n () at debugmy.c:1515myputc(cptr);程序執(zhí)行到第15行上停止,我們采用單步執(zhí)行跟蹤錯誤的發(fā)生,輸入:(gdb) stepmyputc (cptr=0x9bbe40 U211?WVS203? L? 215s) at debugmy.c:77*cptr = a;程序執(zhí)行一行,進入函數(shù)myputc,再單

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論