Linux培訓(xùn)-C編程_第1頁
Linux培訓(xùn)-C編程_第2頁
Linux培訓(xùn)-C編程_第3頁
Linux培訓(xùn)-C編程_第4頁
Linux培訓(xùn)-C編程_第5頁
已閱讀5頁,還剩28頁未讀 繼續(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 培訓(xùn) - Linux下使用C語言,許智君 Z,內(nèi)容提綱,gcc gdb Make Windows到Linux程序移植,C語言簡(jiǎn)介,在80年代末期美國國家標(biāo)準(zhǔn)協(xié)會(huì)(American National Standards Institute)發(fā)布了一個(gè)被稱為ANSI C的C語言標(biāo)準(zhǔn)。這更加保證了將來在不同平臺(tái)上的C的一致性。 Linux上可用的C編譯器是GNU C編譯器, 它建立在自由軟件基金會(huì)的編程許可證的基礎(chǔ)上,因此可以自由發(fā)布。你能在Linux的發(fā)行光盤上找到它,GNU C 編譯器,一、基本用法 gcc options filenames 說明: 在gcc后面可以有多個(gè)編譯選項(xiàng),

2、同時(shí)進(jìn)行多個(gè)編譯操作。很多的gcc選項(xiàng)包括一個(gè)以上的字符。因此你必須為每個(gè)選項(xiàng)指定各自的連字符。例如,下面的兩個(gè)命令是不同的: gcc -p -g test1.c gcc -pg test1.c 當(dāng)不用任何選項(xiàng)編譯一個(gè)程序時(shí),GCC將會(huì)建立(假定編譯成功)一個(gè)名為a.out的可執(zhí)行文件。,基本編譯選項(xiàng),-o選項(xiàng) 你能用 -o 編譯選項(xiàng)來為將產(chǎn)生的可執(zhí)行文件指定一個(gè)文件名來代替 a.out。 例:gcc o count count.c -c選項(xiàng):告訴GCC僅把源代碼編譯為目標(biāo)代碼而跳過匯編和連接的步驟。這個(gè)選項(xiàng)使用的非常頻繁,因?yàn)樗沟镁幾g多個(gè)C程序時(shí)速度更快并且更易于管理。缺省時(shí)GCC建立的目

3、標(biāo)代碼文件有一個(gè).o的擴(kuò)展名。 例:gcc c test2.c,警告選項(xiàng),在gcc中用開關(guān)-Wall控制警告信息,使用示例命令如下: gcc Wall -o test3_1 test3_1.c,查找選項(xiàng),gcc一般使用默認(rèn)路徑查找頭文件和庫文件。如果文件所用的頭文件或庫文件不在缺省目錄下,則編譯時(shí)要指定它們的查找路徑。 -I選項(xiàng):指定頭文件的搜索目錄 例: gcc I/export/home/st o test1 test1.c -L選項(xiàng):指定庫文件的搜索目錄 例: gcc L/usr/X11/R6/lib o test1 test1.c,多個(gè)源文件生成一個(gè)可執(zhí)行文件,問題:有多個(gè)源文件時(shí),如

4、何生成一個(gè)可執(zhí)行文件? 方法1:gcc Wall o mytest test1.c test2.c test3.c 方法2: gcc-Wall -c test1.c gcc-Wall c test2.c gcc-Wall c test3.c gcc o mytest test1.o test2.o test3.o,優(yōu)化選項(xiàng),優(yōu)化選項(xiàng)可以使GCC在耗費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性的基礎(chǔ)上產(chǎn)生更小更快的可執(zhí)行文件。這些選項(xiàng)中最典型的是-O和-O2選項(xiàng)。 -O選項(xiàng):告訴GCC對(duì)源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)行的更快。 -O2選項(xiàng):告訴GCC 產(chǎn)生盡可能小和盡可能快的代碼。-O2

5、選項(xiàng)將使編譯的速度比使用-O時(shí)慢。但通常產(chǎn)生的代碼執(zhí)行速度會(huì)更快。,版本選項(xiàng),-v選項(xiàng) 用戶將會(huì)得到自己目前正在使用的gcc的版本及與版本相關(guān)的一些信息。 gcc -v 將得到如下結(jié)果: Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2 -V 選項(xiàng) 如果安裝了多個(gè)版本的gcc,并且想強(qiáng)制執(zhí)行其中的某個(gè)版本,可以用命令通知系統(tǒng)用戶要使用的版本。 gcc -V2.6.3 -v,調(diào)試和剖析選項(xiàng),使用調(diào)試選項(xiàng)后,gcc在進(jìn)行編譯的時(shí)候,在目標(biāo)文件(.o)和創(chuàng)建的可執(zhí)行文件中插入額外信息,這些

6、額外信息使gdb能夠判斷編譯過的代碼和源代碼之間的關(guān)系。 -g選項(xiàng):告訴GCC產(chǎn)生能被 GNU 調(diào)試器使用的調(diào)試信息以便調(diào)試你的程序。 例:gcc g o test3 test3.c -pg選項(xiàng):告訴GCC在你的程序里加入額外的代碼,執(zhí)行時(shí),產(chǎn)生gprof用的剖析信息以顯示你的程序的耗時(shí)情況。 使用gdb調(diào)試工具,命令行如下: 例:gcc ggdb3 o test3 test3.c,用gdb調(diào)試GCC程序,gdb是一個(gè)用來調(diào)試C和C+程序的常用調(diào)試工具之一。 gdb所提供的一些功能: 監(jiān)視程序中變量的值。 設(shè)置斷點(diǎn)以使程序在指定的代碼行上停止執(zhí)行。 逐行執(zhí)行代碼。 分析崩潰程序的產(chǎn)生的core

7、文件,gdb基本用法,需要調(diào)試的程序,在編譯時(shí)要使用調(diào)試選項(xiàng)。在默認(rèn)的情況下,調(diào)試符號(hào)不會(huì)編譯到程序中。調(diào)試之后,不需要重新編譯程序。 gdb filename 出現(xiàn) (gdb) 在這里,可以輸入調(diào)試命令,基本gdb命令,file 裝入想要調(diào)試的可執(zhí)行文件。 kill 終止正在調(diào)試的程序。 list 執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部。 next 執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部。 step 執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部。 run 執(zhí)行當(dāng)前被調(diào)試的程序 quit 終止 gdb watch 能監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變。 break 在代碼里設(shè)置斷點(diǎn), 這將使程序執(zhí)行到這里時(shí)被掛起。 mak

8、e 能不退出 gdb 就可以重新產(chǎn)生可執(zhí)行文件。 shell 能不離開 gdb 就執(zhí)行 UNIX shell 命令。,GDB的靜態(tài)調(diào)試啟動(dòng)方法,當(dāng)需要在命令行通過gdb來啟動(dòng)可執(zhí)行程序的時(shí)候: gdb 此時(shí)gdb會(huì)加載可執(zhí)行程序的符號(hào)表和堆棧,并為啟動(dòng)程序作好準(zhǔn)備; 設(shè)置可執(zhí)行程序的命令行參數(shù): set args 設(shè)置斷點(diǎn): b或break 通過命令r或run來啟動(dòng)程序,或者通過c或continue命令來繼續(xù)已經(jīng)被暫停的程序; 當(dāng)程序core的時(shí)候,需要查看core文件的內(nèi)容,使用以下方式: gdb 此時(shí)候,gdb會(huì)結(jié)合可執(zhí)行程序的符號(hào)和堆棧來查看core文件內(nèi)容,以分析程序在core掉時(shí)的內(nèi)

9、存影象;,GDB的動(dòng)態(tài)調(diào)試啟動(dòng)方法,動(dòng)態(tài)調(diào)試就是在不終止正在運(yùn)行的進(jìn)程的情況下來對(duì)這個(gè)正在運(yùn)行的進(jìn)程進(jìn)行調(diào)試 gdb 直接在gdb中把一個(gè)正在運(yùn)行的進(jìn)程連接到gdb中,以便于進(jìn)行動(dòng)態(tài)調(diào)試 使用attach命令: attach detach: 調(diào)試結(jié)束之后,可以使用該命令斷開進(jìn)程與gdb的連接 使用attach命令的例子: gdb file #指定進(jìn)程所關(guān)聯(lián)的程序源代碼和符號(hào)表 attach . 使用gdb的命令進(jìn)行調(diào)試; . detach #調(diào)試結(jié)束,解除進(jìn)程與gdb的連接,使進(jìn)程繼續(xù)運(yùn)行,GDB調(diào)試過程中使用到的概念和命令,gdb的工作路徑: pwd: 查看gdb當(dāng)前的工作路徑; cd :

10、改變gdb當(dāng)前的工作路徑; info terminal:顯示gdb當(dāng)前所使用的終端的類型信息,gdb的環(huán)境,show paths: 顯示當(dāng)前路徑變量的設(shè)置情況; show environment/env VARNAME:顯示程序的環(huán)境變量VARNAME的值; set environment/env VARNAME = VALUE:設(shè)置程序的某個(gè)環(huán)境變量VARNAME的值;只對(duì)所調(diào)試的程序有效,對(duì)gdb本身不起作用 unset environment/env VARNAME:刪除程序的某個(gè)環(huán)境變量VARNAME;,斷點(diǎn),斷點(diǎn)的作用是當(dāng)程序運(yùn)行到斷點(diǎn)時(shí),無論它在做什么,都會(huì)被停止下來.對(duì)于每個(gè)斷點(diǎn)

11、,你還可以設(shè)置一些更高級(jí)的信息以決定斷點(diǎn)在什么時(shí)候起作用. 設(shè)置斷點(diǎn)的位置:代碼行、函數(shù)上、地址上.在那些含有異常處理的語言(如C+)中,還可以在異常發(fā)生的地方設(shè)置斷點(diǎn) 斷點(diǎn)分為普通斷點(diǎn)和條件斷點(diǎn),設(shè)置普通的斷點(diǎn),使用break/b命令來設(shè)置普通斷點(diǎn);有很多種方法可以設(shè)置斷點(diǎn): A、break FUNCTION 在某個(gè)函數(shù)上設(shè)置斷點(diǎn) B、break +OFFSET 或 break OFFSET 程序運(yùn)行到當(dāng)前行時(shí)的前幾行或后幾行; OFFSET表示行號(hào); C、break LINENUM 在行號(hào)為L(zhǎng)INENUM的行上設(shè)置斷點(diǎn). D、break FILENAME:LINENUM 在FILENAME

12、文件中的第LINENUM行上設(shè)置斷點(diǎn); E、break FILENAME:FUNCTION 在FILENAME文件中的名為FUNCTION的函數(shù)上設(shè)置斷點(diǎn) F、break *ADDRESS 在地址ADDRESS上設(shè)置斷點(diǎn).這個(gè)命令允許你在沒有調(diào)試信息的程序中設(shè)置斷點(diǎn); G、break 不含任何參數(shù)的break命令,會(huì)在當(dāng)前執(zhí)行到的程序運(yùn)行棧中的下一條指令上設(shè)置一個(gè)斷點(diǎn).,條件斷點(diǎn),條件斷點(diǎn)就是設(shè)置的斷點(diǎn)只在某個(gè)條件成立的時(shí)候才有效,才會(huì)使程序在運(yùn)行到斷點(diǎn)之前停止; break . if CONDITION 這個(gè)命令設(shè)置一個(gè)條件斷點(diǎn),條件由CONDITION來決定.在gdb每次執(zhí)行到此時(shí),如果C

13、ONDITION條件的值被計(jì)算為非0,那么程序就在該斷點(diǎn)處停止; tbreak ARGS: 該命令設(shè)置斷點(diǎn)為只有效一次.ARGS的使用同break中的參數(shù)的使用,刪除斷點(diǎn),當(dāng)一個(gè)斷點(diǎn)使用完之后,需要?jiǎng)h除這些斷點(diǎn);clear命令和delete命令可以完成這項(xiàng)任務(wù); A、clear: 不帶任何參數(shù)的clear命令會(huì)在當(dāng)前所選擇的棧上清除下一個(gè)所要執(zhí)行到的斷點(diǎn)(指令級(jí)).當(dāng)你當(dāng)前的棧幀是棧中最內(nèi)層的時(shí)候,使用這個(gè)命令可以很方便地刪除剛才程序停止處的斷點(diǎn); B、clear FUNCTION 和 clear FILENAME:FUNCTION 刪除名為FUNCTION的函數(shù)上的斷點(diǎn); C、clear L

14、INENUM 和 clear FILENAME:LINENUM 刪除第LINENUM行上的斷點(diǎn); D、delete breakpoints BNUMS. 刪除參數(shù)所指定的斷點(diǎn),如果沒有指定參數(shù),則刪除程序中所有的斷點(diǎn).命令可以縮寫成d,使斷點(diǎn)暫時(shí)不起作用,使用enable命令來激活斷點(diǎn)或觀察點(diǎn) 使用disable命令來使斷點(diǎn)或觀察點(diǎn)暫時(shí)不起作用 使用info break或info watch命令來觀察哪些斷點(diǎn)是活躍的;,設(shè)置觀察點(diǎn),可以使用一個(gè)觀察點(diǎn)來停止一個(gè)程序的執(zhí)行,當(dāng)某個(gè)表達(dá)式的值改變時(shí),觀察點(diǎn)將會(huì)停止程序,而不需要事先在某個(gè)地方設(shè)置一個(gè)斷點(diǎn) A、watch EXPR watch命令使用

15、EXPR作為表達(dá)式設(shè)置一個(gè)觀察點(diǎn).gdb將把表達(dá)式加入到程序中,并監(jiān)視程序的運(yùn)行,當(dāng)表達(dá)式的值被改變的時(shí)候,gdb將會(huì)停止程序 B、rwatch EXPR: 使用EXPR作為表達(dá)式設(shè)置一個(gè)斷點(diǎn),當(dāng)EXPR被程序讀取時(shí),程序被gdb暫停 C、awatch EXPR: 使用EXPR作為表達(dá)式設(shè)置一個(gè)觀察點(diǎn),當(dāng)EXPR被讀出然后被寫入時(shí),gdb會(huì)暫停程序;這個(gè)命令常和rwatch合用 D、info watchpoints: 顯示所有設(shè)置的觀察點(diǎn)的列表;它與info breakpoints命令類似,其它gdb調(diào)試命令,continue/c: 繼續(xù)運(yùn)行被中斷的程序; backtrace/bt: 顯示當(dāng)前

16、堆棧的內(nèi)容; print/p : 打印表達(dá)式或變量的值; frame/f : 選擇一個(gè)棧幀,并進(jìn)入這個(gè)棧幀,同時(shí)打印被選擇的棧幀的內(nèi)容摘要信息;該命令的參數(shù)是一個(gè)棧幀的號(hào)碼或者是一個(gè)棧幀地址; info stack/frame: 顯示棧/幀的摘要信息; run/r: 在gdb中啟動(dòng)并運(yùn)行程序; help info: 顯示命令info的用法; help : 顯示命令Command的詳細(xì)用法,對(duì)多線程程序的調(diào)試,thread THREAD_NO: 該命令用于在線程之間進(jìn)行切換,把線程號(hào)為THREAD_NO(gdb設(shè)置的線程號(hào))的線程設(shè)置為當(dāng)前線程 info threads: 查詢當(dāng)前進(jìn)程所擁有的所

17、有線程的狀態(tài)摘要信息;gdb按照順序顯示: a、線程號(hào): gdb為被調(diào)試進(jìn)程中的線程設(shè)置的順序號(hào); b、目標(biāo)系統(tǒng)的線程標(biāo)識(shí); c、此線程的當(dāng)前棧信息; 一些前面帶*號(hào)的線程,表示該線程是當(dāng)前線程; thread apply THREAD_NO ALL ARGS: 該命令用于向線程提供命令,實(shí)例,程序test3_1a.c(簡(jiǎn)單程序樣例) 程序test3_2.c test3_2a.c (程序優(yōu)化樣例 ,用命令time ./test3_2查看效果) 程序test3_3.c(錯(cuò)誤程序的例子,用gdb查錯(cuò)),程序自動(dòng)維護(hù)工具make,問題:當(dāng)開發(fā)的程序非常龐大,且關(guān)系復(fù)雜,手工編譯鏈接非常困難 解決:

18、利用一個(gè)自動(dòng)系統(tǒng)控制和協(xié)調(diào)整個(gè)程序的創(chuàng)建過程。在這個(gè)自動(dòng)系統(tǒng)中,程序員可以定義創(chuàng)建規(guī)則并通過這個(gè)規(guī)則進(jìn)行項(xiàng)目的開發(fā)。 makefile就是定義這種規(guī)則的文件。GNU make 解釋執(zhí)行Makefile/makefile。,make是一種自動(dòng)生成和維護(hù)目標(biāo)程序的工具。 可以調(diào)用編譯器、連接器等 根據(jù)程序各部分的修改情況,重新編譯鏈接目標(biāo)代碼 輸入make命令后,系統(tǒng)自動(dòng)檢測(cè)系統(tǒng)文件和以定義的規(guī)則,完成整個(gè)創(chuàng)建過程,程序自動(dòng)維護(hù)工具make,簡(jiǎn)單makefile文件的寫法 由若干規(guī)則組成,每個(gè)規(guī)則說明一個(gè)目標(biāo) 規(guī)則的格式: 目標(biāo)屬性 分隔符依賴文件;命令菜單 命令菜單 說明:表示可選,表示可以多次出現(xiàn) 涉及的文件名允許用通配符 例子:c程序test5_1.txt和它的m

溫馨提示

  • 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)論