滕健偉--1315212033--嵌入式實驗五實驗報告_第1頁
滕健偉--1315212033--嵌入式實驗五實驗報告_第2頁
滕健偉--1315212033--嵌入式實驗五實驗報告_第3頁
滕健偉--1315212033--嵌入式實驗五實驗報告_第4頁
滕健偉--1315212033--嵌入式實驗五實驗報告_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、嵌入式原理與應(yīng)用實驗實驗五gcc編譯程序與gdb調(diào)試程序?qū)W號1315212033姓名滕健偉班級13電子二班華僑?;曇電3工程系實驗五gcc編譯程序與gdb調(diào)試程序一、實驗?zāi)康?. 通過幾種不同需求的程序,掌握使用gcc的各種選項編譯程序。2. 通過調(diào)試一個有問題的程序,使讀者進一步熟練使用vi操作,而且熟練掌握 gcc編譯命令及gdb的調(diào)試命令,通過對有問題程序的跟蹤調(diào)試,進一步提 高發(fā)現(xiàn)問題和解決問題的能力。二、實驗內(nèi)容:1、學(xué)習(xí)使用gcc的各種選項編譯程序。(1) 編譯和運行這段程序hell() c:#include <stdio. h>int main(void)printf

2、 ( “hello world!n");return 0;roogcc# v i he i io .croogcc# gcc he 1 lo ac -o he i ioroo t'wsv gcc# ./he i io he i io c)r id!roogcc# |(2) 創(chuàng)建靜態(tài)庫,并運行程序/* pow test. c */#include <stdio.h>#include <stdlib. h>int inain(int argc, char *argv)unsigned int x, y;unsigned long long res;if (

3、argc < 3) | | (sscanf (argvlj, "%u", &x) != 1)i| (sscanf(argv2, "%u", &y) != 1) printf("usage: pow base exponentn);exit (1);res = unsgn_pow(x, y);printf cz%u " %u = %urt, x, y, res);exit (0);/* unsgn_pow. c:庫程序 */unsigned long long unsgn_pow(unsigned int x, u

4、nsigned int y)unsigned long long res = 1;if (v = 0)res = 1;else if (y = 1)res = x;elseres 二 x * unsgn_pow(x, y - 1);return res;創(chuàng)建靜態(tài)庫,然后編譯主程序,并運行結(jié)果。roogcc#roogcc#gcc 一c unsgn_pow. car rcsv 1 ibpow.a unsgn_pov.oa - unsgn_pow,o 【oov gcc# root'wv gcc#2,10 = 1024gcc -o pontes t powtes t ,c -l. - ipow

5、./poutes t 2 10| mogcc#roogcc#roogcc# root(uw gcc #(3) 針對(2)的程序,創(chuàng)建動態(tài)庫,然后編譯主程序,并運行結(jié)果。對比兩者 的區(qū)別。gcc -fpic-wll -c unsgnpow.cgcc -shared -o 1 ibpow. so unsgn_pow.o gcc -o pote s t powtes t .c -l. ipow rootww gcc# 1 she 1 ioi ibpow.apoy_testunsgn_pow.che i io.c i ibpow. so poutes t.c unsgn_pow.o rootxww g

6、cc# gcc -o poutes t pov_tes t .c -l.roogcc# cp i ibpow. so / i ibrootvwiv gcch ./poultes t 2 102,10 = 1024| roo tgcc #(4) 對下面程序進行優(yōu)化編譯,對比優(yōu)化前后的結(jié)果,并解釋說明結(jié)果。#include <stdi() h>int main(void)double counter;double result;double temp;for (counter = 0; counter < 2000.0 * 2000.0 * 2000.0 / 20.0 + 202

7、0;counter +二(5 - 1) / 4) temp = counter / 1979;result 二 counter;printf( result is %lfn” , result); return 0;rootxww gcc# v i 4. croot<w gcc# gcc 4 .c -o 4rootww gcc# t irre ./4result is 400002019.000000irea iorrtl .597s人user0n4.550ssysont) >000srootwuv gcc# gcc -o4.c -o 4roolswv gcc# i im?/4re

8、sult is 400002019.000000rea 10ml .230suser0ml . 180ssysont) .000s|rootw gcc# |對程序進行優(yōu)化z后,可以明顯看出程序運行的時間大大縮短了,提高了程序運行的效率。2、用gdb調(diào)試程序的bug(1) 使用vi編輯器,將以下代碼輸入到名為greet, c的文件中。此代碼的原意 為輸出倒序niqin函數(shù)屮定義的字符串,但結(jié)果顯示沒有輸出。代碼如下所示:#include <stdio. h>int displayl(char *string);int display2(char *string);int main (

9、)char string = ''embedded linux"displayl (string);display2 (string);int displayl (char *string)printf ("the original string is %s nz/, string);int di splay2 (char *stringl)char *string2;int size, i;size = strlen (stringl);string2 = (char *) malloc (size + 1);for (i = 0; i < size

10、; i+)string2size - i二 stringli;string2csize+l二'';printf(z/the string afterward is %sr/:string2);(2) 使用gcc編譯這段代碼,注意要加上“飛”選項以方便之后的調(diào)試。(3) 運行生成的可執(zhí)行文件,觀察運行結(jié)果。rootwv gdb# v i gree t .crootww gdb# gcc -g gree t .c -o gree trootww gdb# ./gree tthe or igna i string is enbedded linuxthe s t r ing af t

11、erward is觀察這段代碼并分析得知,代碼所要實現(xiàn)的功能為將預(yù)先輸入的一段字符串倒序輸出, 由運行結(jié)果可知,最后輸出結(jié)果為空,產(chǎn)生了錯誤輸ul但程序本身語法并不存在錯誤。(4) 使用gdb調(diào)試程序,通過設(shè)置斷點、單步跟蹤,一步步找岀錯誤所在。root<ww gdb# gdb gree tcmj gdb red hit linux (5.3post-0.20021129.18rh)copyr igh t 2003 free sof tmre foundation. inc.(eb is f ree software, covered by the cnj genera i public

12、 license» and you are e iconr to change i t and/or distr ibute copies of i t under cer ta in cond i t ions . type w show copy ing to see the cond i t ions .there is abso lu ttly no ar ran ty for gdb. type " show war ran tyw for details. th is (db wis con t igured as * i386-redha t- i inux-

13、gnuw ,.(gdb) i1 #include<stdio.h>22 int d isp layl(char *s tr ing);3 int d isp iay2(char *s tr ing):54 in t nn in()5 6 char s tr ing = wenbedded linux*;7 d isp lay 1 (str ing);8 d isp iay2 (str ing);(gdb)9 jl2(gdb) b 25breakpo int 1 a t(gdb) b 29breakpo int 2 a t(gdb) info bnim type1 breakpo i

14、nt2 breakpo int首先使用gdb調(diào)試器打開所要調(diào)試文件,再通過gdb中的命令字符list (i)查看載入的文件的 代碼。由觀察分析知,在25行和29行設(shè)置斷點最為合適,設(shè)置斷點后查看所設(shè)置斷點處的信 息。0x804841c: f ile gree t c» i ine 25.0x804844c: file greet .c. 1 ine 29.disp enb address ¥ia tkeep y0x0804841c in d ispiay2 a t gree t.c:25keep y0x0804844c in d isp iay2 a t gree t.c:

15、29緊接著運行代碼,當(dāng)程序運行到斷點25處時自動停止,此時,通過命令“p” +變量名稱查 看變量值,此處,我選擇查看size, string 1和string2的值,通過對原程序的分析可知,size為 字符串string 1的大小,正確;string 1顯示為embedded linux,正確;而string2通過內(nèi)存分配 獲得了相應(yīng)的內(nèi)存,此吋string2為空值;正確。(gdb) ri istart ing program /root/gdb/gree tthe or ignai str ing is enbedded linuxbreakpo int 1. disp iay2 (str

16、ingl =oxbf f fe3f() 'errbedded linux' ) a t gree t .c:2525forj( i=0;i<size;i+)m(gdb) p size$1 = 14(gdb) p str ingl$2 = oxbfffe3fo enbedded linux*(gdb) p string2$3 = 0x80496c0 (gdb) p sting20,l2,3,4.5,6,7,8,9,10,ll.12,13,14$4=0 y選擇繼續(xù)運行代碼,代碼運行到29處時停止,重復(fù)上一步操作可知string20為空值,而 strings-13均相對應(yīng)的值,

17、說明原程序屮循環(huán)嵌套語句屮出現(xiàn)了計算錯誤,錯誤語句為:string2size-i=stri ngl i;(gdb) cycont inuing.人breakpoint 2 display2 (str ingl=0xbfffe3f0 9enbedded linux9) a t gree t.c:2929s t r ing2 size+1 = * *;(gdb) p s"ing201 23,4,5,678.9.10.11,12,13,14$5 =69 'e*(gdb) p str ing2$6 = 0x80496c0 八(gdb) p str ing0bb synbo1 w s t r ingw in current context(gdb) p str ing20$7=0 909(gdb) p str ing21$8 = 120 亡(gdb) p str ing22$9 = 117 w(gdb) p str ing23$10 = 110 h(5) 糾正錯謀,更改源程序并得到正確的結(jié)果。將上述語句更改為string2size-i-l=stringl i,再將程序重新編譯一次, 運行后得到正確結(jié)果。(gdb) q

溫馨提示

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

最新文檔

評論

0/150

提交評論