嵌入式Linux軟件開發(fā)概述_第1頁
嵌入式Linux軟件開發(fā)概述_第2頁
嵌入式Linux軟件開發(fā)概述_第3頁
嵌入式Linux軟件開發(fā)概述_第4頁
嵌入式Linux軟件開發(fā)概述_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式Linux軟件開發(fā)工具本章內(nèi)容介紹計(jì)算機(jī)編程語言的分類討論解釋型語言、編譯型語言和編譯過程Linux程序設(shè)計(jì)論述如何使用LINUX的C語言工具完成代碼編輯,縮進(jìn),編譯,模塊化程序的處理,程序庫的建立,代碼管理及版本控制等工作概述 Linux軟件開發(fā)一直在Internet環(huán)境下進(jìn)行。這個(gè)環(huán)境是全球性的,編程人員來自世界各地。只要能夠訪問Web站點(diǎn),就可以啟動(dòng)一個(gè)以Linux為基礎(chǔ)的軟件項(xiàng)目。Linux開發(fā)工作經(jīng)常是在Linux用戶決定共同完成一個(gè)項(xiàng)目時(shí)開始的。當(dāng)開發(fā)工作完成后,該軟件就被放到Internet站點(diǎn)上,任何用戶都可以訪問和下載它。由于這個(gè)活躍的開發(fā)環(huán)境,新的以Linux為基礎(chǔ)的

2、軟件功能日益強(qiáng)大,而且呈現(xiàn)爆炸式的增長(zhǎng)態(tài)勢(shì)。大多數(shù)Linux軟件是經(jīng)過自由軟件基金會(huì)(Free Software Foundation)提供的GNU(GNU 即 GNUs not UNIX)公開認(rèn)證授權(quán)的,因而通常被稱作GNU軟件。GNU軟件免費(fèi)提供給用戶使用,并被證明是非??煽亢透咝У?。許多流行的Linux實(shí)用程序如C編譯器、shell和編輯器都是GNU軟件應(yīng)用程序。 Linux程序設(shè)計(jì)語言高級(jí)語言C、C+、JAVA、FROTRAN、腳本語言(Script Language)Shell: bash、tcsh、 kshPerl、Python、tcl/tk、sed、awk編程工具命令行環(huán)境:編輯

3、工具vi、emacs、gedit編譯、鏈接gcc調(diào)試gdbmake命令版本控制工具CVS等IDE:Emacs/xemacsKdevelopEclipseKylix3Linux編程風(fēng)格 1、GNU風(fēng)格函數(shù)返回類型說明和函數(shù)名分兩行放置,函數(shù)起始字符和函數(shù)開頭左花括號(hào)放到最左邊。盡量不要讓兩個(gè)不同優(yōu)先級(jí)的操作符出現(xiàn)在相同的對(duì)齊方式中,應(yīng)該附加額外的括號(hào)使得代碼縮進(jìn)可以表示出嵌套。 每個(gè)程序都應(yīng)該以一段簡(jiǎn)短的說明其功能的注釋開頭。 請(qǐng)為每個(gè)函數(shù)書寫注釋,說明函數(shù)是做什么的,需要哪些入口參數(shù),參數(shù)可能值的含義和用途。如果用了非常見的、非標(biāo)準(zhǔn)的東西,或者可能導(dǎo)致函數(shù)不能工作的任何可能的值,應(yīng)該進(jìn)行特殊說

4、明。如果存在重要的返回值,也需要說明。 不要聲明多個(gè)變量時(shí)跨行,每一行都以一個(gè)新的聲明開頭。 當(dāng)一個(gè)if中嵌套了另一個(gè)if-else時(shí),應(yīng)用花括號(hào)把if-else括起來。 要在同一個(gè)聲明中同時(shí)說明結(jié)構(gòu)標(biāo)識(shí)和變量或者結(jié)構(gòu)標(biāo)識(shí)和類型定義(typedef)。先定義變量,再使用。 GNU風(fēng)格盡量避免在if的條件中進(jìn)行賦值。 在名字中使用下劃線以分割單詞,盡量使用小寫;把大寫字母留給宏和枚舉常量,以及根據(jù)統(tǒng)一慣例使用的前綴。例如,應(yīng)該使用類似ignore_space_change_flag的名字;不要使用類似iCantReadThis的名字。用于表明一個(gè)命令行選項(xiàng)是否給出的變量應(yīng)該在選項(xiàng)含義的說明之后,

5、而不是選項(xiàng)字符之后被命名。2. Linux 內(nèi)核編程風(fēng)格Linux內(nèi)核縮進(jìn)風(fēng)格是8個(gè)字符。 Linux內(nèi)核風(fēng)格采用K&R標(biāo)準(zhǔn),將開始的大括號(hào)放在一行的最后,而將結(jié)束的大括號(hào)放在一行的第一位。命名盡量簡(jiǎn)潔。不應(yīng)該使用諸如ThisVariableIsATemporaryCounter之類的名字。應(yīng)該命名為tmp,這樣容易書寫,也不難理解。但是命名全局變量,就應(yīng)該用描述性命名方式,例如應(yīng)該命名“count_active_users()”,而不是“cntusr()”。本地變量應(yīng)該避免過長(zhǎng)。函數(shù)最好短小精悍,一般來說不要讓函數(shù)的參數(shù)多于個(gè),否則應(yīng)該嘗試分解這個(gè)過于復(fù)雜的函數(shù)。 通常情況,注釋說明代碼的功

6、能,而不是其實(shí)現(xiàn)原理。避免把注釋插到函數(shù)體內(nèi),而寫到函數(shù)前面,說明其功能,如果這個(gè)函數(shù)的確很復(fù)雜,其中需要有部分注釋,可以寫些簡(jiǎn)短的注釋來說明那些重要的部分,但是不能過多。Linux內(nèi)核使用GNU C和AT&T匯編。要了解linux編程風(fēng)格程序生成工具生成c語言源代碼:vi、emacs、pico等編輯器縮進(jìn)C語言代碼 最著名的縮進(jìn)風(fēng)格是Brian Kernighan和Dennis Ritchie(Unix和C語言的發(fā)明者)在世界上第一本講C語言的書C程序設(shè)計(jì)語言中建議使用的(即所謂的K&R風(fēng)格)。 LINUX提供了一個(gè)indent命令用于自動(dòng)調(diào)整C代碼的縮進(jìn)風(fēng)格, 默認(rèn)情況下indent會(huì)按照

7、GNU風(fēng)格進(jìn)行縮進(jìn),并保留用戶輸入的所有回車符。 indent second.c這條命令會(huì)把縮進(jìn)后的結(jié)果保存在second.c,并把原來的效果備份為second.c $ more second.cmain()int i, j;for (i=0,j=10; i j; i+)printf(LINUX統(tǒng)治網(wǎng)絡(luò)世界!n);$ indent second.c $ lssecond.c second.c$ more second.cmain() int i, j; for(i = 0, j = 10; i j; i+) printf(LINUX統(tǒng)治網(wǎng)絡(luò)世界!n); 按照GNU風(fēng)格進(jìn)行縮進(jìn)Indent命令語

8、法:indent 選項(xiàng) 源文件列表indent 選項(xiàng) 源文件 -o 輸出文件功能:此命令讀入用戶指定的、在語法上沒有錯(cuò)誤的源文件并按一定的規(guī)范增刪空白字符以實(shí)現(xiàn)恰當(dāng)?shù)目s進(jìn)。如果指定了輸出文件,那么縮進(jìn)后的程序會(huì)保存在輸出文件里;反之將保存在源文件里,并將原來的文件添上一個(gè)后綴存為備份。常用選項(xiàng):在以下兩行注釋之間的代碼不會(huì)被indent縮進(jìn),注意*與INDENT, ON和OFF與*之間沒有空格,但你可以在兩個(gè)*之間隨意增加空格。/*INDENT OFF*/*INDENT ON*/-bad 強(qiáng)制在聲明之后斷行-bap 強(qiáng)制在函數(shù)體后面斷行-bl 按Pascal方式縮進(jìn)代碼-bls 把結(jié)構(gòu)體聲明后

9、的大括號(hào)放到單獨(dú)的一行上-orig 按Berkeley風(fēng)格縮進(jìn)代碼-st 把縮進(jìn)后的結(jié)果送到標(biāo)準(zhǔn)輸出 縮進(jìn)C語言代碼 $ more second.cmain()int i, j;for (i=0,j=10; i j; i+)printf(LINUX統(tǒng)治網(wǎng)絡(luò)世界!n);$縮進(jìn)C語言代碼 $ indent -kr -st second.cmain() int i, j; for(i = 0, j = 10; i j; i+) printf(LINUX統(tǒng)治網(wǎng)絡(luò)世界!n); $ indent -bad -kr -st second.cmain() int i, j; for(i = 0, j =10;

10、 i j; i+) printf(LINUX統(tǒng)治網(wǎng)絡(luò)世界!n); 流行的K&R(-kr選項(xiàng))風(fēng)格 -bad選項(xiàng)的功能是在變量聲明后面添一個(gè)空行 縮進(jìn)C語言代碼 $ indent -orig -st second.cmain() int i, j; for(i = 0, j = 10; i j; i+) printf(LINUX統(tǒng)治網(wǎng)絡(luò)世界!n); Berkeley(-orig選項(xiàng))風(fēng)格 c程序的編譯Linux下最常用的c編譯器是gcc(GNU c/c+ compiler)C+編譯器是g+gcc命令語法:gcc 選項(xiàng) 文件列表常用選項(xiàng)/功能:-c 編譯成目標(biāo)(.o)文件-l 庫文件名 連接庫文件

11、-o 文件名 將生成的可執(zhí)行文件保存到指定文件中,默認(rèn)是a.outc程序的編譯$gcc first.c #編譯后生成a.out可執(zhí)行文件$./a.out #運(yùn)行程序Linux統(tǒng)治網(wǎng)絡(luò)世界!$gcc -o slogan first.c #編譯后生成slogan可執(zhí)行文件$./slogan #運(yùn)行程序Linux統(tǒng)治網(wǎng)絡(luò)世界!用-c選項(xiàng)編譯成目標(biāo)文件$gcc -c driver.c #編譯后生成driver.o目標(biāo)文件$gcc -c stack.c #編譯后生成stack.o目標(biāo)文件$gcc -c misc.c #編譯后生成misc.o目標(biāo)文件$gcc driver.o stack.o misc.o

12、 o polishc程序的編譯使用gcc的-l選項(xiàng)可以連接已有的程序庫數(shù)學(xué)庫libm.a連接到power.o$gcc power.o -lm o power文件名中“l(fā)ib”以后,擴(kuò)展名以前的部分make程序make程序:是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具make程序提供一種可以用于構(gòu)件大規(guī)模工程的、強(qiáng)勁的而靈活的機(jī)制。句法:make 選項(xiàng) 目標(biāo) 宏定義用途:make工具根據(jù)名為makefile或Makefile的文件中指定的依賴關(guān)系對(duì)系統(tǒng)進(jìn)行更新。選項(xiàng)目標(biāo)宏定義可以以任意順序指定。常用選項(xiàng)/特性:-d顯示調(diào)試信息-f 文件此選項(xiàng)告訴make使用指定文件作為依賴關(guān)系文件

13、,而不是默認(rèn)的makefile或Makefile,如果指定的文件名是-,那么make將從標(biāo)準(zhǔn)輸入讀入依賴關(guān)系。-h顯示所有選項(xiàng)的幫助信息-n測(cè)試模式,并不真的執(zhí)行任何命令,只是顯示輸出這些命令-s安靜模式-不輸出任何提示信息。make程序make工具依賴一個(gè)特殊的,名為makefile的文件,這個(gè)文件描述了系統(tǒng)中各個(gè)模塊之間的依賴關(guān)系。 GNU make的主要功能是讀進(jìn)一個(gè)文本文件makefile并根據(jù)makefile的內(nèi)容執(zhí)行一系列的工作。makefile的默認(rèn)文件名為GNUmakefile、makefile或Makefile,當(dāng)然也可以在make的命令行中指定別的文件名。如果不特別指定,m

14、ake命令在執(zhí)行時(shí)將按順序查找默認(rèn)的makefile文件。多數(shù)Linux程序員使用第三種文件名Makefile。因?yàn)榈谝粋€(gè)字母是大寫,通常被列在一個(gè)目錄的文件列表的最前面。 make程序Makefile是一個(gè)文本形式的數(shù)據(jù)庫文件,其中包含一些規(guī)則來告訴make處理哪些文件以及如何處理這些文件。這些規(guī)則主要是描述哪些文件(稱為target目標(biāo)文件,不要和編譯時(shí)產(chǎn)生的目標(biāo)文件相混淆)是從哪些別的文件(稱為dependency依賴文件)中產(chǎn)生的,以及用什么命令(command)來執(zhí)行這個(gè)過程。make會(huì)對(duì)磁盤上的文件進(jìn)行檢查,如果目標(biāo)文件的生成或被改動(dòng)時(shí)的時(shí)間(稱為該文件時(shí)間戳)至少比它的一個(gè)依賴文

15、件還舊的話,make就執(zhí)行相應(yīng)的命令,以更新目標(biāo)文件。目標(biāo)文件不一定是最后的可執(zhí)行文件,可以是任何一個(gè)中間文件并可以作為其他目標(biāo)文件的依賴文件。make程序Makefile規(guī)則的語法格式:目標(biāo)文件列表:依賴文件列表命令列表一個(gè)Makefile文件主要含有一系列的規(guī)則,每條規(guī)則包含以下內(nèi)容?!澳繕?biāo)文件列表”,即make最終需要?jiǎng)?chuàng)建的文件,如可執(zhí)行文件和目標(biāo)文件;目標(biāo)也可以是要執(zhí)行的動(dòng)作,如“clean”?!耙蕾囄募斜怼?,通常是編譯目標(biāo)文件所需要的其他文件。 “命今列表”,是make執(zhí)行的動(dòng)作,通常是把指定的相關(guān)文件編譯成目標(biāo)文件的編譯命令,每個(gè)命令占一行,且每個(gè)命令行的起始字符必須為TAB字符

16、。 除非特別指定,否則make的工作目錄就是當(dāng)前目錄。 “目標(biāo)文件列表”是需要?jiǎng)?chuàng)建的二進(jìn)制文件或目標(biāo)文件,依賴文件列表是在創(chuàng)建“目標(biāo)文件列表”時(shí)需要用到的一個(gè)或多個(gè)文件的列表,命令序列是創(chuàng)建“目標(biāo)文件列表”文件所需要執(zhí)行的步驟,比如編譯命令。make程序例如,有以下的Makefile文件:# 一個(gè)簡(jiǎn)單的Makefile的例子 test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc c prog.c o prog.ocode.o:code.c code.hgcc c code.c o code.oclean

17、:rm f *.o make程序上面的Makefile文件中共定義了四個(gè)目標(biāo):test、prog.o、code.o和clean。目標(biāo)從每行的最左邊開始寫,后面跟一個(gè)冒號(hào)(:),如果有與這個(gè)目標(biāo)有依賴性的其他目標(biāo)或文件,把它們列在冒號(hào)后面,并以空格隔開。然后另起一行開始寫實(shí)現(xiàn)這個(gè)目標(biāo)的一組命令。在Makefile中,可使用續(xù)行號(hào)()將一個(gè)單獨(dú)的命令行延續(xù)成幾行。但要注意在續(xù)行號(hào)()后面不能跟任何字符(包括空格和鍵)。一般情況下,調(diào)用make命令可輸入:$make targettarget是Makefile文件中定義的目標(biāo)之一,如果省略target,make就將生成Makefile文件中定義的第一

18、個(gè)目標(biāo)。對(duì)于上面Makefile的例子,單獨(dú)的一個(gè)“make”命令等價(jià)于:$ make test因?yàn)閠est是Makefile文件中定義的第一個(gè)目標(biāo),make首先將其讀入,然后從第一行開始執(zhí)行,把第一個(gè)目標(biāo)test作為它的最終目標(biāo),所有后面的目標(biāo)的更新都會(huì)影響到test的更新。第一條規(guī)則說明只要文件test的時(shí)間戳比文件prog.o或code.o中的任何一個(gè)舊,下一行的編譯命令將會(huì)被執(zhí)行。make程序在檢查文件prog.o和code.o的時(shí)間戳之前,make會(huì)在下面的行中尋找以prog.o和code.o為目標(biāo)的規(guī)則,在第三行中找到了關(guān)于prog.o的規(guī)則,該文件的依賴文件是prog.c、pro

19、g.h和code.h。同樣,make會(huì)在后面的規(guī)則行中繼續(xù)查找這些依賴文件的規(guī)則,如果找不到,則開始檢查這些依賴文件的時(shí)間戳,如果這些文件中任何一個(gè)的時(shí)間戳比prog.o的新,make將執(zhí)行“gcc c prog.c o prog.o”命令,更新prog.o文件。以同樣的方法,接下來對(duì)文件code.o做類似的檢查,依賴文件是code.c和code.h。當(dāng)make執(zhí)行完所有這些套嵌的規(guī)則后,make將處理最頂層的test規(guī)則。如果關(guān)于prog.o和code.o的兩個(gè)規(guī)則中的任何一個(gè)被執(zhí)行,至少其中一個(gè).o目標(biāo)文件就會(huì)比test新,那么就要執(zhí)行test規(guī)則中的命令,因此make去執(zhí)行g(shù)cc命令將p

20、rog.o和code.o連接成目標(biāo)文件test。make程序在上面Makefile的例子中,還定義了一個(gè)目標(biāo)clean,它是Makefile中常用的一種專用目標(biāo),即刪除所有的目標(biāo)模塊。make做的工作:首先make按順序讀取makefile中的規(guī)則,然后檢查該規(guī)則中的依賴文件與目標(biāo)文件的時(shí)間戳哪個(gè)更新,如果目標(biāo)文件的時(shí)問戳比依賴文件還早,就按規(guī)則中定義的命令更新目標(biāo)文件。如果該規(guī)則中的依賴文件又是其他規(guī)則中的目標(biāo)文件,那么依照規(guī)則鏈不斷執(zhí)行這個(gè)過程,直到Makefile文件的結(jié)束,至少可以找到一個(gè)不是規(guī)則生成的最終依賴文件,獲得此文件的時(shí)間戳,然后從下到上依照規(guī)則鏈執(zhí)行目標(biāo)文件的時(shí)間戳比此文件

21、時(shí)間戳舊的規(guī)則,直到最頂層的規(guī)則。 Makefile中的變量(宏)Makefile里的變量就像一個(gè)環(huán)境變量。事實(shí)上,環(huán)境變量在make中也被解釋成make的變量。這些變量對(duì)大小寫敏感,一般使用大寫宇母。幾乎可以從任何地方引用定義的變量,變量的主要作用如下: 保存文件名列表。在前面的例子里,作為依賴文件的一些目標(biāo)文件名出現(xiàn)在可執(zhí)行文件的規(guī)則中,而在這個(gè)規(guī)則的命令行里同樣包含這些文件并傳遞給gcc做為命令參數(shù)。如果使用一個(gè)變量來保存所有的目標(biāo)文件名,則可以方便地加入新的目標(biāo)文件而且不易出錯(cuò)。 保存可執(zhí)行命令名,如編譯器。在不同的Linux系統(tǒng)中存在著很多相似的編譯器系統(tǒng),這些系統(tǒng)在某些地方會(huì)有細(xì)微

22、的差別,如果項(xiàng)目被用在一個(gè)非gcc的系統(tǒng)里,則必須將所有出現(xiàn)編譯器名的地方改成用新的編譯器名。但是如果使用一個(gè)變量來代替編譯器名,那么只需要改變?cè)撟兞康闹?。其他所有地方的命令名就都改變了。保存編譯器的參數(shù)。在很多源代碼編譯時(shí),gcc需要很長(zhǎng)的參數(shù)選項(xiàng),在很多情況下,所有的編譯命令使用一組相同的選項(xiàng),如果把這組選項(xiàng)使用一個(gè)變量代表,那么可以把這個(gè)變量放在所有引用編譯器的地方。當(dāng)要改變選項(xiàng)的時(shí)候,只需改變一次這個(gè)變量的內(nèi)容即可。 Makefile中的變量Makefile中的變量是用一個(gè)文本串在Makefile中定義的,這個(gè)文本串就是變量的值。只要在一行的開始寫下這個(gè)變量的名字,后面跟一個(gè)“”號(hào),以

23、及要設(shè)定這個(gè)變量的值即可定義變量,下面是定義變量的語法:VARNAME=string使用時(shí),把變量用括號(hào)括起來,并在前面加上$符號(hào),就可以引用變量的值: $(VARNAME) make解釋規(guī)則時(shí),VARNAME在等式右端展開為定義它的字符串。變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量名都應(yīng)該是大寫。如果變量的值發(fā)生變化,就只需要在一個(gè)地方修改,從而簡(jiǎn)化了Makefile的維護(hù)。 Makefile中的變量現(xiàn)在利用變量把前面的Makefile重寫一遍:OBJS=prog.o code.oCC=gcctest:$(OBJS)$(CC) o test $(OBJS)p

24、rog.o:prog.c prog.h code.h$(CC) c prog.c o prog.ocode.o:code.c code.h$(CC) c code.c o code.oclean:rm f *.o Makefile中的變量除用戶自定義的變量外,make還允許使用環(huán)境變量、自動(dòng)變量和預(yù)定義變量。使用環(huán)境變量的方法很簡(jiǎn)單,在make啟動(dòng)時(shí),make讀取系統(tǒng)當(dāng)前已定義的環(huán)境變量,并且創(chuàng)建與之同名同值的變量,因此用戶可以像在shell中一樣在Makefile中方便的引用環(huán)境變量。需要注意,如果用戶在Makefile中定義了同名的變量,用戶自定義變量將覆蓋同名的環(huán)境變量。Makefile

25、中還有一些預(yù)定義變量和自動(dòng)變量,但是看起來并不像自定義變量那樣直觀。圖 make關(guān)系樹的第一層圖 make關(guān)系樹的前兩層圖 一個(gè)簡(jiǎn)單程序的make關(guān)系樹靜態(tài)分析工具 對(duì)一個(gè)程序的靜態(tài)分析指的是在非執(zhí)行狀態(tài)分析它的結(jié)構(gòu)和屬性。例如測(cè)試代碼跨平臺(tái)特性,計(jì)算源程序的行數(shù),函數(shù)調(diào)用次數(shù) (function points),以及每個(gè)函數(shù)在程序運(yùn)行時(shí)所需時(shí)間占總時(shí)間的百分比等等。 gprof工具完成對(duì)一個(gè)程序的每個(gè)函數(shù)執(zhí)行需要花費(fèi)多少時(shí)間統(tǒng)計(jì)句法:gprof 選項(xiàng) 目標(biāo)文件 gmon.out用途:提取程序運(yùn)行日志文件(call graph profile)gmon.out中的數(shù)據(jù)并生成運(yùn)行分析報(bào)告。常用選

26、項(xiàng)/特性:-b 精簡(jiǎn)模式,不在分析報(bào)告中顯示每一字段的詳細(xì)描述。-e 函數(shù)名 禁止顯示對(duì)指定函數(shù)及其分支(此函數(shù)所調(diào)用的其他函數(shù))分析數(shù)據(jù)以簡(jiǎn)化輸出,用戶可指定多個(gè)-e選項(xiàng)。-E 函數(shù)名 與-e選項(xiàng)類似,不同的是在計(jì)算總時(shí)間和百分比的時(shí)候忽略指定函數(shù)及其分支的運(yùn)行時(shí)間。-f 函數(shù)名只顯示指定函數(shù)及其分支的分析數(shù)據(jù)以簡(jiǎn)化輸出,用戶可指定多個(gè)-f選項(xiàng)。-F 函數(shù)名與-f選項(xiàng)類似,不同的是在計(jì)算總時(shí)間和百分比的時(shí)候只使用指定函數(shù)及其分支的運(yùn)行時(shí)間。-z 允許顯示從未使用過的函數(shù)。 動(dòng)態(tài)分析工具GDB Linux系統(tǒng)中包含了GNU 調(diào)試程序gdb,它是一個(gè)用來調(diào)試C和 C+ 程序的調(diào)試器??梢允钩绦蜷_

27、發(fā)者在程序運(yùn)行時(shí)觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。gdb 所提供的一些功能如下所示:運(yùn)行程序,設(shè)置所有的能影響程序運(yùn)行的參數(shù)和環(huán)境;控制程序在指定的條件下停止運(yùn)行; 當(dāng)程序停止時(shí),可以檢查程序的狀態(tài);修改程序的錯(cuò)誤,并重新運(yùn)行程序; 動(dòng)態(tài)監(jiān)視程序中變量的值; 可以單步執(zhí)行代碼,觀察程序的運(yùn)行狀態(tài)。 調(diào)試工具GDB句法:gdb 選項(xiàng)可執(zhí)行程序core文件|進(jìn)程ID用途:跟蹤指定程序的運(yùn)行,給出它的內(nèi)部運(yùn)行狀態(tài)以協(xié)助你定位程序的bug。你還可以指定一個(gè)程序運(yùn)行錯(cuò)誤產(chǎn)生的core文件,或者正在運(yùn)行的程序進(jìn)程ID.常用選項(xiàng)/特性:-c core文件使用指定core文件檢查程序-h 列出命令行選項(xiàng)的簡(jiǎn)

28、要介紹-n 忽略/.gdbinit文件中指定的執(zhí)行命令-q 禁止顯示介紹信息和版權(quán)信息-s 文件使用保存在指定文件中的符號(hào)表調(diào)試工具GDBgdb程序調(diào)試的對(duì)象是可執(zhí)行文件,而不是程序的源代碼文件。然而,并不是所有的可執(zhí)行文件都可以用gdb調(diào)試。如果要讓產(chǎn)生的可執(zhí)行文件可以用來調(diào)試,需在執(zhí)行g(shù)cc指令編譯程序時(shí),加上-g參數(shù),指定程序在編譯時(shí)包含調(diào)試信息。調(diào)試信息包含程序里的每個(gè)變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號(hào)。gdb 利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián)。 在命令行上輸入gdb并按回車鍵就可以運(yùn)行g(shù)db了,如果一切正常的話,將啟動(dòng)gdb,可以在屏幕上看到以下的內(nèi)容: 調(diào)試工具

29、GDBGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is abs

30、olutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.(gdb)啟動(dòng)gdb后,可以在命令行上指定很多的選項(xiàng)。輸入:help.可以獲得gdb的幫助信息。如果想要了解某個(gè)具體命令(比如break)的幫助信息,在gdb提示符下輸入下面的命令:break屏幕上會(huì)顯示關(guān)于break的幫助信息。從返回的信息可知,break是用于設(shè)置斷點(diǎn)的命令。在Linux Shell提示符輸入:man gdb 可以看到man的手冊(cè)頁。 調(diào)試工具GDBgdb支持

31、很多的命令且能實(shí)現(xiàn)不同的功能。這些命令從簡(jiǎn)單的文件裝入到允許你檢查所調(diào)用的堆棧內(nèi)容的復(fù)雜命令, 下面列出了在使用gdb 調(diào)試時(shí)會(huì)用到的一些命令。1)file命令:裝入想要調(diào)試的可執(zhí)行文件。 2)cd命令:改變工作目錄。 3)pwd命令:返回當(dāng)前工作日錄。 4)run命令:執(zhí)行當(dāng)前被調(diào)試的程序。 5)kill命令:停止正在調(diào)試的應(yīng)用程序。6)list命令:列出正在調(diào)試的應(yīng)用程序的源代碼。 7)break命令:設(shè)置斷點(diǎn)。 8)tbreak命令;設(shè)置臨時(shí)斷點(diǎn)。它的語法與break相同。區(qū)別在于用tbreak設(shè)置的斷點(diǎn)執(zhí)行一次之后立即消失。調(diào)試工具GDB9)watch命令:設(shè)置監(jiān)視點(diǎn),監(jiān)視表達(dá)式的變化

32、。 10)awatch命令:設(shè)置讀寫監(jiān)視點(diǎn)。當(dāng)要監(jiān)視的表達(dá)式被讀或?qū)憰r(shí)將應(yīng)用程序掛起。它的語法與watch命令相同。 11)rwatch命令:設(shè)置讀監(jiān)視點(diǎn),當(dāng)監(jiān)視表達(dá)式被讀時(shí)將程序掛起,等侍調(diào)試。此命令的語法與watch相同。 12)next命令:執(zhí)行下一條源代碼,但是不進(jìn)入函數(shù)內(nèi)部。也就是說,將一條函數(shù)調(diào)用作為一條語句執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)run,開始了代碼的執(zhí)行。 13)step命令:執(zhí)行下一條源代碼,進(jìn)入函數(shù)內(nèi)部。如果調(diào)用了某個(gè)函數(shù),會(huì)跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)用run開始執(zhí)行代碼。 14)display命令:在應(yīng)用程序每次停止運(yùn)行時(shí)顯示表達(dá)式的

33、值。15)info break命令:顯示當(dāng)前斷點(diǎn)列表,包括每個(gè)斷點(diǎn)到達(dá)的次數(shù)。調(diào)試工具GDB16)info files命令:顯示調(diào)試文件的信息。 17)info func命令:顯示所有的函數(shù)名。 18)info local命令:顯示當(dāng)前函數(shù)的所有局部變量的信息。 19)info prog命令:顯示調(diào)試程序的執(zhí)行狀態(tài)。 20)print命令;顯示表達(dá)式的值。 21)delete命令:刪除斷點(diǎn)。指定一個(gè)斷點(diǎn)號(hào)碼,則刪除指定斷點(diǎn)。不指定參數(shù)則刪除所有的斷點(diǎn)。 22)shell命令:執(zhí)行Linux Shell命令。 23)make命令:不退出gdb而重新編譯生成可執(zhí)行文件。 24) help命令:列出

34、gdb命令的種類 25) quit命令:退出gdb。 調(diào)試工具GDB$ gcc -g bugged.c -o bugged$ gdb -q bugged(gdb)進(jìn)入gdb環(huán)境以后,你可以使用很多命令監(jiān)視欲調(diào)試程序的運(yùn)行。 運(yùn)行效率分析 time命令用于對(duì)一個(gè)程序或任何shell命令的運(yùn)行效率分析。此命令計(jì)算三個(gè)時(shí)間:總時(shí)間、系統(tǒng)時(shí)間和用戶時(shí)間,并按“時(shí):分:秒.百分之一秒”的格式輸出。句法:time 用戶命令用途:報(bào)告命令的三種執(zhí)行時(shí)間以便用戶進(jìn)行運(yùn)行效率分析。三個(gè)時(shí)間分別是總時(shí)間(程序從開始運(yùn)行到完成的時(shí)間)、系統(tǒng)時(shí)間(系統(tǒng)干預(yù)活動(dòng)占用的時(shí)間)和用戶時(shí)間(程序代碼執(zhí)行的時(shí)間)。 使用Kdevelop開發(fā)C程序Kdevelop是一套功能強(qiáng)大的集成開發(fā)環(huán)境,其整合了開發(fā)程序所需的編譯器、連接器、除錯(cuò)工具、版本控制工具等,可以用Kdevelop快速地建立各式各樣的應(yīng)用程序,包括:KDE程序;GNOME;Qt程序;終端程序;其它 啟動(dòng)Kdevelop 如果是第一次使用Kdevelop,Kd

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論