程序的編譯與調(diào)試實(shí)驗(yàn)報(bào)告.docx_第1頁(yè)
程序的編譯與調(diào)試實(shí)驗(yàn)報(bào)告.docx_第2頁(yè)
程序的編譯與調(diào)試實(shí)驗(yàn)報(bào)告.docx_第3頁(yè)
程序的編譯與調(diào)試實(shí)驗(yàn)報(bào)告.docx_第4頁(yè)
程序的編譯與調(diào)試實(shí)驗(yàn)報(bào)告.docx_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

實(shí)驗(yàn)二 程序的編譯與調(diào)試第一部分 配置本地計(jì)算機(jī)與虛擬機(jī)的通訊一、 配置本地計(jì)算機(jī)的vmnet1網(wǎng)絡(luò)接口1、 由開始控制面網(wǎng)絡(luò)連接2、 雙擊VMware Network Adapter VMnet1接口在“VMware Network Adapter VMnet1”狀態(tài)對(duì)話框中選擇屬性按鈕3、 在“VMware Network Adapter VMnet1”屬性對(duì)話框中雙擊“Internet協(xié)議(TCP/IP)”出現(xiàn)“Internet協(xié)議(TCP/IP)屬性”對(duì)話框例:若VMnet1的IP地址為:7 子網(wǎng)掩碼為:那么:虛擬機(jī)中Linux設(shè)置的IP地址必須是:10.64.254.xx 其中xx表示:1254二、 配置虛擬機(jī)1、 打開虛擬機(jī),但不要執(zhí)行Power on this virtual machine而是雙Network Adapter2、 在出現(xiàn)的“Virtual Machine Setting”對(duì)話框中確保選中“Host-only”選項(xiàng)確定按鈕3、 選擇“Power on this virtual machine”啟動(dòng)虛擬機(jī)三、 配置Linux網(wǎng)絡(luò)接口的IP地址1、使用root用戶登錄linux操作系統(tǒng)后,執(zhí)行netconfig命令,將linux計(jì)算機(jī)IP地址設(shè)置為與本地計(jì)算機(jī)的VMnet1網(wǎng)絡(luò)接口的IP地址處于同一網(wǎng)段,設(shè)置完成后輸入reboot重啟linux操作系統(tǒng)例:若VMnet1的IP地址為:7 子網(wǎng)掩碼為:那么:虛擬機(jī)中Linux設(shè)置的IP地址必須是:10.64.254.xx 其中xx表示:12542、在本地計(jì)算由9/gaobao/下載ssh_pshell,打開ssh_pshell連接虛擬機(jī),以root用戶登錄第二部分 gcc編譯器的使用作業(yè):編譯如下程序,并填寫程序的輸出結(jié)果:1、源代碼-Pointer.c#include int main() int a = 100, b = 200; int *p1 = &a, *p2 = &b; printf(“%d, %dn”,a,b); printf(“%d,%dn”,*p1, *p2); printf(“%x,%xn”,&a,&a); printf(“%x,%xnn”,p1,p2); *p1 = *p1*3; Printf(“%dn”,a); Printf(“%dnn”,*p1); p1 = &b; printf(“%xn”,p1); printf(“%xn”,p2); return 0;2、 編譯:#gcc o pointer pointer.c3、 執(zhí)行#./point(二)、運(yùn)行結(jié)果運(yùn)行結(jié)果:100 200100 200bfff5c4 bffff5c4bffff5c4 bffff5c0需要的技能0、vi編輯器的使用Vi是廣泛應(yīng)用于各種unix和Linux系統(tǒng)中的文本編輯器,它是標(biāo)準(zhǔn)的Linux文本編輯程序。它可打開或保存的格式均為ASCii格式(文本)。(一)、創(chuàng)建文件格式:vi n 如果 文件已經(jīng)存在,vi會(huì)打開現(xiàn)存文件n 如果是一個(gè)新文件,vi會(huì)創(chuàng)建它 (二)、vi編輯器的模式n 輸入模式(插入模式)n 命令模式由輸入模式轉(zhuǎn)入命令模式:ESC鍵由命令模式轉(zhuǎn)入輸入模式:a、A;o、O;i、I字符鍵1、 輸入模式轉(zhuǎn)入輸入模式:n 添加:n 輸入a后,在光標(biāo)的右邊插入文本 n 輸入A,在一行的結(jié)尾處添加文本 n 插入:n 通過在命令模式下輸入i,在光標(biāo)的左邊插入文本 n 通過在命令模式下輸入I,在行首插入文本 n 插入新行:n 輸入o,在當(dāng)前光標(biāo)位置下面打開一行 n 輸入O,在當(dāng)前光標(biāo)位置上面打開一行 2、 命令模式在該模式中,可以輸入命令來(lái)執(zhí)行許多種功能大多數(shù)的vi命令都是由一個(gè)或兩個(gè)字母加上一個(gè)可選數(shù)字組成1)、命令模式可執(zhí)行的命令2)、翻頁(yè)n 向前翻頁(yè)一屏:要向前滾動(dòng)(向下移動(dòng))一整屏,需按下Ctrl-f。光標(biāo)將移動(dòng)到新屏的左上角n 向前滾動(dòng)半屏:要向前滾動(dòng)半屏,需按Ctrl-dn 向后翻頁(yè)一屏:要向后滾動(dòng)(即向上移動(dòng))一整屏,需按下Ctrl-bn 向后滾動(dòng)半屏:要向后滾動(dòng)半屏,需按下Ctrl-u3)、撤消更改n 撤消前一個(gè)命令:在最后一個(gè)命令之后立即輸入u來(lái)撤消該命令n 撤消對(duì)一行的更改:輸入U(xiǎn)來(lái)撤消你對(duì)一行所做的所有更改這個(gè)命令只有在你沒將光標(biāo)移動(dòng)到該行以外時(shí)才生效4)、刪除文本n 刪除一個(gè)字符:n 為刪除一個(gè)字符,需將光標(biāo)放置在要?jiǎng)h除的字符上并輸入xn 為刪除光標(biāo)之前(其左邊)的一個(gè)字符,需輸入Xn 刪除一個(gè)詞或詞的部分內(nèi)容:n 為刪除一個(gè)詞,需將光標(biāo)放置到該詞的開頭并輸入dwn 為刪除詞的部分內(nèi)容,需將光標(biāo)放置到該詞要保存部分的右邊。輸入dw來(lái)刪除該詞余下的部分n 刪除一行:n 將光標(biāo)放置到該行的任意處并輸入ddn 刪除行的部分內(nèi)容:n 將光標(biāo)放置到該行要保存部分的右邊,并輸入D。為刪除光標(biāo)左邊的所有內(nèi)容,須將光標(biāo)放置到該行要?jiǎng)h除部分的右邊,并輸入d0(d-零)。n 刪除到文件的結(jié)尾:n 為刪除從當(dāng)前行到文件結(jié)尾的所有內(nèi)容,需輸入dG5)、復(fù)制和移動(dòng)文本n 復(fù)制一行命令:yyn 粘貼命令:pn 移動(dòng)文本:n 先將要移動(dòng)的部分用刪除命令刪除,然后再粘貼就可以了3、查找字符串1)、查找一個(gè)字符串:n 輸入/,并在/后面輸入要查找的串,然后按下回車n 輸入“n”跳轉(zhuǎn)到該串的下一個(gè)出現(xiàn)處n 輸入“N”跳轉(zhuǎn)到該串的上一個(gè)出現(xiàn)處2)、替換一個(gè)字符串n 在一行內(nèi)替換頭一個(gè)字符串old為新的字符串newn :s/old/newn 在一行內(nèi)替換所有的字符串old為新的字符串newn :s/old/new/gn 在兩行內(nèi)替換所有的字符串old為新的字符串newn :#,#s/old/new/gn 在文件內(nèi)替換所有的字符串old為新的字符串newn :%s/old/new/gn 進(jìn)行全文替換時(shí)詢問用戶確認(rèn)每個(gè)替換需添加c選項(xiàng)n :%s/old/new/gc一、程序的編譯過程在使用gcc編譯程序時(shí),編譯過程可以分為4個(gè)階段1)、預(yù)處理(Pre-Processing)在預(yù)處理階段,輸入的是C語(yǔ)言的源文件。在這個(gè)階段主要處理源文件中的#indef、#include和#define預(yù)處理命令。該階段會(huì)生成一個(gè)中間文件*.i,但實(shí)際工作中一般不用專門生成這個(gè)文件,若必須要生成這個(gè)文件,可以使用如下命令:#gcc E test.c -o test.i說(shuō)明:它通過對(duì)源文件test.c使用E選項(xiàng)來(lái)生成中間文件test.i2)、匯編(Assembling)在匯編階段,輸入的是中間文件*.i,編譯后生成匯編編語(yǔ)言文件*.s。這個(gè)階段對(duì)應(yīng)的gcc命令如下:#gcc -S test.i -o test.s3)、編譯(Compiling)在編譯階段,將輸入的匯編文件*.s轉(zhuǎn)換成二進(jìn)制機(jī)器代碼*.o,這個(gè)階段對(duì)應(yīng)的命令如下:#gcc -c test.s -o test.o在功能上,預(yù)處理、編譯、匯編是3個(gè)不同的階段,但gcc在實(shí)際操作時(shí)可以把這3個(gè)步驟合并為一個(gè)步驟來(lái)執(zhí)行 4)、鏈接(Linking)在鏈接階段將輸入的二進(jìn)制機(jī)器代碼*.o,與其它的機(jī)器代碼和庫(kù)文件匯集成一個(gè)可執(zhí)行的二進(jìn)制代碼文件,這步驟通過以下命令來(lái)實(shí)現(xiàn):#gcc test.o -o test 最終生成可執(zhí)行文件test上述過程可以簡(jiǎn)化為:#gcc -c test.c -o test.o#gcc test.o -o test或直接使用一條命令;#gcc test.c -o test二、gcc常用選項(xiàng)使用gcc編譯源程序時(shí),源文件可能不止一個(gè),這時(shí)就需要使用gcc編譯多個(gè)源文件,使用的命令如下:#gcc -o test testmain.c other1.c other2.cgcc 最基本的用法是:格式: gcc 選項(xiàng) filenames選項(xiàng):-c 只編譯,不鏈接成可執(zhí)行文件,編譯器只是由輸入的.c等為后綴的源 代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子 程序文件 -o output_filename 確定輸出文件的名稱為output_filename,同時(shí)這個(gè)名稱 不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就默認(rèn) 將輸出的可執(zhí)行文件命名為a.out -g 產(chǎn)生調(diào)試器gdb所必需的符號(hào)信息,要對(duì)源代碼進(jìn)行調(diào)試,就必須在 編譯程序時(shí)加入這個(gè)選項(xiàng) -O 對(duì)程序進(jìn)行優(yōu)化編譯、鏈接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、 鏈接過程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率較高, 但是,編譯、鏈接的速度就相應(yīng)地要慢一些-O2 比-O更好的優(yōu)化編譯、鏈接,當(dāng)然整編譯、鏈接過程會(huì)更慢-Wall 輸出所有警告信息,在編譯過程中如果gcc遇到一些認(rèn)為可能會(huì)發(fā)生 錯(cuò)誤的地方就會(huì)提出一些相應(yīng)的警告和提示信息,提示注意這個(gè)地方 是不是會(huì)有什么錯(cuò)誤-w 關(guān)閉所有警告,建議不要使用這個(gè)選項(xiàng)-Idirnme 將名為dirname的目錄加入到程序頭文件目錄列表中,它是在預(yù) 處理階段使用的選項(xiàng)。I意指Incude 在C語(yǔ)言程序中,頭文件被大量使用。一般而言,C程序通常由頭文件(header files)和定義文件(definition files)組成。頭文件一般包含函數(shù)原型說(shuō)明、常量定義的文件,用于保存程序的聲明,而定義文件用于保存程序的實(shí)現(xiàn)C程序中包含頭文件有兩種方法: #include #include “myinc.h”第一種使用尖括號(hào)(),第二種使用(“”)。對(duì)于第一種,編譯器gcc在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中查找相應(yīng)的頭文件myinc.h。而對(duì)于第二種,編譯器gcc首先在當(dāng)前目錄中查找頭文件,如果當(dāng)前目錄中沒有找到需要的頭文件,就到指定的dirname目錄中去尋找。對(duì)于系統(tǒng)提供的頭文件,通常以第一種方式包含到源程序中。在實(shí)際開發(fā)中,對(duì)于自己編寫的頭文件,通常放在與源程序相同的目錄中,并以第二種方法包含該頭文件。但在編寫大型程序時(shí),往往把頭文件單獨(dú)放在一個(gè)目錄中,此時(shí)編譯程序時(shí)需要用該選項(xiàng)告訴編譯器到名為dirname的目錄中去查找頭文件。否則,編譯器會(huì)因?yàn)檎也坏较鄳?yīng)的頭文件而使編譯失敗。-Ldirname 將名為dirname的目錄加入到程序的庫(kù)文件搜索目錄列表中,它 在鏈接過程中使用的參數(shù)。L意指Link 庫(kù)是事先已經(jīng)編寫好的代碼,經(jīng)過編譯后可以直接調(diào)用的文件。也可以編寫屬于自己的庫(kù)文件,以方便自己使用或提供給他人使用。庫(kù)體現(xiàn)了軟件工程中的軟件重用的思想。對(duì)于一些常用的功能,可以編寫成一系統(tǒng)的函數(shù),并把這些函數(shù)按功能放在庫(kù)文件中。系統(tǒng)默認(rèn)提供了許多庫(kù),比如數(shù)學(xué)函數(shù)庫(kù),它提供了一些求絕對(duì)值、開方、求三角函數(shù)值等功能函數(shù)。庫(kù)分為兩種:靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。在默認(rèn)情況下,編譯器gcc在系統(tǒng)默認(rèn)路徑中(如/usr/lib)尋找所需要的庫(kù)文件,這個(gè)選項(xiàng)告訴編譯器,首先到-L指定的目錄中去尋找,然后到系統(tǒng)默認(rèn)的路徑中尋找,如果函數(shù)庫(kù)放在多個(gè)目錄下,就需要依次使用這個(gè)選項(xiàng),給出相應(yīng)的存放目錄。 -lname 指示編譯器,在鏈接時(shí),裝載名為libname.a的函數(shù)庫(kù),該函數(shù)庫(kù)位 于系統(tǒng)預(yù)定義的目錄或者由-L選項(xiàng)指定的目錄下,如-lm表示鏈接 名為libm.a的數(shù)學(xué)函數(shù)庫(kù)第三部分 gdb編譯器的使用作業(yè)1、程序1計(jì)算1100的和,應(yīng)該輸出5050,但程序運(yùn)行后輸出值為:4950# cat -n test.c 1 #include 2 3 int get_sum(int n) 4 5 int sum = 0, i; 6 for (i=0;in;i+) 7 sum +=i; 8 return sum; 9 10 11 int main() 12 13 int i = 100, result; 14 result = get_sum(i); 15 printf(1+2+.+%d=%dn,i,result); 16 return 0; 17 編譯并運(yùn)行該程序:# gcc -g test.c -o test# ./test1+2+.+100=4950試用gdb調(diào)試器說(shuō)明程序設(shè)計(jì)錯(cuò)誤在何處(gdb) break 7 if i=99Breakpoint 5 at 0x80483aa: file test.c, line 7.(gdb) runThe program being debugged has been started already.Start it from the beginning? (y or n) yStarting program: /home2/b5/testBreakpoint 5, get_sum (n=100) at test.c:77 sum+=i;(gdb) print i$5 = 99(gdb) print sum$6 = 4851(gdb) next6 for(i=0;in;i+)(gdb) next8 return sum;(gdb) print sum$7 = 4950(gdb) next9 (gdb) nextmain () at test.c:1515 printf(1+2+.+%d=%dn,i,result);(gdb) next1+2+.+100=495016 return 0;(gdb) next17 (gdb) next0x4003a250 in _libc_start_main () from /lib/tls/libc.so.6所以少加一個(gè)100正確的完整代碼為:#includeint get_sum(int n) int sum=0,i; for(i=0;i=n;i+) sum+=i; return sum;int main() int i=100,result; result=get_sum(i); printf(1+2+.+%d=%dn,i,result); return 0;2、程序2在sort()函數(shù)中有兩個(gè)循環(huán)。外層循環(huán)針對(duì)每個(gè)數(shù)組元素執(zhí)行一次,它的循環(huán)計(jì)數(shù)變量是i。內(nèi)層循環(huán)的作用是交換相鄰的兩個(gè)元素。總的效果是讓比較小的元素像“氣泡”一樣“冒”到數(shù)組的頂部。外層循環(huán)每執(zhí)行一次,數(shù)組中的最大的元素就會(huì)“下沉”到數(shù)組的底部。我們可以通過在外層循環(huán)中停止此程序的運(yùn)行并檢查數(shù)組的狀態(tài)來(lái)核實(shí)這一點(diǎn)/* 1 */ typedef struct /* 2 */ char data4096;/* 3 */ int key;/* 4 */ item;/* 5 */ /* 6 */ item array = /* 7 */ bill, 3,/* 8 */ neil, 4,/* 9 */ john, 2,/* 10 */ rick, 5,/* 11 */ alex, 1,/* 12 */ ;/* 13 */ /* 14 */ sort(a,n)/* 15 */ item *a; /* 16 */ /* 17 */ int i = 0, j = 0;/* 18 */ int s = 1;/* 19 */ /* 20 */ for(; i n & s != 0; i+) /* 21 */ s = 0;/* 22 */ for(j = 0; j aj+1.key) /* 24 */ item t = aj;/* 25 */ aj = aj+1;/* 26 */ aj+1 = t;/* 27 */ s+;/* 28 */ /* 29 */ /* 30 */ n-;/* 31 */ /* 32 */ /* 33 */ #include /* 34 */ main()/* 35 */ /* 36 */ int i;/* 37 */ sort(array,5); /* 38 */ for(i = 0; i 5; i+)/* 39 */ printf(array%d = %s, %dn,/* 40 */ i, arrayi.data, arrayi.key);/* 41 */ 程序的運(yùn)行結(jié)果為:array0 = john, 2array1 = alex, 1array2 = bill, 3array3 = neil, 4array4 = rick, 5由運(yùn)行結(jié)果可以看出,程序并未按從小到大的順序排列,試說(shuō)明原因:(gdb) info displayAuto-display expressions now in effect:Num Enb Expression2: y array0 51: y array0 5(gdb) info breakNum Type Disp Enb Address What3 breakpoint keep y 0x080483cb in sort at test2.c:21 breakpoint already hit 3 times cont(gdb) disable display2warning: bad breakpoint number at or near display2(gdb) disable display 2(gdb) runStarting program: /home2/b5/test2Breakpoint 3, sort (a=0x80496a0, n=5) at test2.c:2121 for(j = 0; j n-1; j+) 1: array0 5 = data = bill, 0 , key = 3, data = neil, 0 , key = 4, data = john, 0 , key = 2, data = rick, 0 , key = 5, data = alex, 0 , key = 1Breakpoint 3, sort (a=0x80496a0, n=4) at test2.c:2121 for(j = 0; j n-1; j+) 1: array0 5 = data = bill, 0 , key = 3, data = john, 0 , key = 2, data = neil, 0 , key = 4, data = alex, 0 , key = 1, data = rick, 0 , key = 5Breakpoint 3, sort (a=0x80496a0, n=3) at test2.c:2121 for(j = 0; j n-1; j+) 1: array0 5 = data = john, 0 , key = 2, data = bill, 0 , key = 3, data = alex, 0 , key = 1, data = neil, 0 , key = 4, -Type to continue, or q to quit-return data = rick, 0 , key = 5array0 = john, 2array1 = alex, 1array2 = bill, 3array3 = neil, 4array4 = rick, 5Program exited with code 0224.(gdb) disable break 3(gdb) diaable display 2Undefined command: diaable. Try help.(gdb) disable display 1(gdb) list 3025 aj+1 = t;26 s+;27 28 29 n-;30 31 32 #include 33 main()34 (gdb) break 29Breakpoint 4 at 0x80484b2: file test2.c, line 29.(gdb) commands 2No breakpoint number 2.(gdb) commands 4Type commands for when breakpoint 4 is hit, one per line.End with a line saying just end.set variable n=n+1contend(gdb) runStarting program: /home2/b5/test2Breakpoint 4, sort (a=0x80496a0, n=5) at test2.c:2929 n-;Breakpoint 4, sort (a=0x80496a0, n=5) at test2.c:2929 n-;Breakpoint 4, sort (a=0x80496a0, n=5) at test2.c:2929 n-;Breakpoint 4, sort (a=0x80496a0, n=5) at test2.c:2929 n-;Breakpoint 4, sort (a=0x80496a0, n=5) at test2.c:2929 n-;array0 = alex, 1array1 = john, 2array2 = bill, 3array3 = neil, 4array4 = rick, 5A、程序1的調(diào)試過程在Linux應(yīng)用程序開發(fā)中,最常用的調(diào)試器是gdb,它可以在程序中設(shè)置斷點(diǎn)、查看變量值、一步一步跟蹤程序的執(zhí)行過程。利用調(diào)試器的這些功能可以方便地找出程序中存在的非語(yǔ)法錯(cuò)誤。一、啟動(dòng)和退出gdbgdb調(diào)試的對(duì)象是可執(zhí)行文件,而不是程序的源代碼。如果要使一個(gè)可執(zhí)行文件可以被gdb調(diào)試,那么在使用編譯器gcc編譯程序時(shí)需要加入-g選項(xiàng)。-g選項(xiàng)告訴gcc在編譯程序時(shí)加入調(diào)試信息,這樣才可以調(diào)試這個(gè)被編譯的程序。例:計(jì)算1100的和,應(yīng)該輸出5050# cat -n test.c 1 #include 2 3 int get_sum(int n) 4 5 int sum = 0, i; 6 for (i=0;in;i+) 7 sum +=i; 8 return sum; 9 10 11 int main() 12 13 int i = 100, result; 14 result = get_sum(i); 15 printf(1+2+.+%d=%dn,i,result); 16 return 0; 17 編譯并運(yùn)行該程序:# gcc -g test.c -o test# ./test1+2+.+100=4950(一)、調(diào)試一個(gè)程序的命令格式格式:gdb 例:#gdb test或 #gdb (gdb) file test(二)、退出 (gdb) quit二、顯示和查找程序的源代碼在調(diào)試時(shí),一般要查看程序的源代碼。list 命令用于列出程序的源代碼,使用格式如下:l list 顯示10行代碼,若再次運(yùn)行該命令則顯示接下來(lái)的10行代碼l list 5, 10 顯示源代文件test.c中的第5行到第10行的代碼,l list test.c:5,10 顯示源文件test.c中第5行到第10行的代碼,在調(diào)試含有多個(gè)源文件的程序時(shí)使用l list get_sum 顯示get_sum函數(shù)周圍的代碼l list test.c:get_sum 顯示源文件test.c中g(shù)et_sum函數(shù)周圍的代碼,在調(diào)試含多個(gè)源文件的程序時(shí)使用l search 用來(lái)從當(dāng)前行向后查找第一個(gè)匹配的字符串l reverse-search 用來(lái)從當(dāng)前行向前查找第一個(gè)匹配的字符串三、執(zhí)行程序和獲得幫助使用gdb test或(gdb) fiel test只是裝入程序,程序并沒有運(yùn)行,如果要使程序運(yùn)行,在gdb提示符下輸入run即可。(gdb) runStarting program: /tmp/test1+2+.+100=4950Program exited normally.如果想要詳細(xì)了解gdb某個(gè)命令的使用方法,可以使用help命令(gdb)help list(gdb)help all四、設(shè)置和管理斷點(diǎn)在調(diào)試程序時(shí),往往需要程序在運(yùn)行到某行、某個(gè)函數(shù)或某個(gè)條件發(fā)生時(shí)暫停下來(lái),然后查看此時(shí)程序的狀態(tài),如各個(gè)變量的值、某個(gè)表達(dá)式的值等。為此,可以設(shè)置斷點(diǎn)(break)。斷點(diǎn)使程序運(yùn)行到某個(gè)位置時(shí)暫停下來(lái),以便檢查和分析程序。1、 以行號(hào)設(shè)置斷點(diǎn)在gdb中,大部分都是使用break命令為程序設(shè)置斷點(diǎn)。而指定斷點(diǎn)時(shí),最常用的是為某行設(shè)置斷點(diǎn)。例:(gdb) break 7Breakpoint 1 at 0x80483c0: file test.c, line 7. 然后我們輸入run命令運(yùn)行程序:(gdb) runStarting program: /tmp/testBreakpoint 1, get_sum (n=100) at test.c:77 sum +=i;可以看到,程序運(yùn)行完第6行的指令后就暫停了,第7行的代碼并沒有執(zhí)行而是被gdb的斷點(diǎn)中斷了。此時(shí),我們可以查看各個(gè)變量和表達(dá)式的值,以了解程序的當(dāng)前狀態(tài)。2、以函數(shù)名設(shè)置斷點(diǎn)在break命令后跟上函數(shù)名,就可以為函數(shù)設(shè)置斷點(diǎn)。例:(gdb) break get_sumBreakpoint 1 at 0x80483aa: file test.c, line 5.(gdb) runStarting program: /tmp/testBreakpoint 1, get_sum (n=100) at test.c:55 int sum = 0,i;可以看到,程序在第5行停了上來(lái)。3、以條件表達(dá)式設(shè)置斷點(diǎn)程序在運(yùn)行過程中,當(dāng)某個(gè)條件滿足時(shí),程序在某行中斷暫停執(zhí)行方法1 命令格式:break 行號(hào)或函數(shù)名 if 條件例:(gdb) clearDeleted breakpoint 1(gdb) break 7 if i=99Breakpoint 2 at 0x80483c0: file test.c, line 7.(gdb) runThe program being debugged has been started already.Start it from the beginning? (y or n) yStarting program: /tmp/testBreakpoint 2, get_sum (n=100) at test.c:77 sum +=i; 可以看到,運(yùn)行程序后在i=99時(shí),程序中斷在第7行。方法2 watch 例:(gdb) watch i=99No symbol i in current context.(gdb) list 61 #include 23 int get_sum(int n)4 5 int sum = 0,i;6 for (i=0;in;i+)7 sum +=i;8 return sum;9 10(gdb) break 6Breakpoint 1 at 0x80483b1: file test.c, line 6. (gdb) runStarting program: /tmp/testBreakpoint 1, get_sum (n=100) at test.c:66 for (i=0;in;i+)Gdb運(yùn)行后,以命令watch i=99設(shè)置條件斷點(diǎn),但是失敗了,gdb提示在當(dāng)前程序的上下文中沒有符號(hào)i,這是因?yàn)榇藭r(shí)test程序沒有運(yùn)行,變量i還沒有被定義。為了解決這個(gè)問題,首先在第6行設(shè)置斷點(diǎn),然后使用run命令運(yùn)行程序,程序暫停在第6行,此時(shí)第5行的語(yǔ)句已經(jīng)被執(zhí)行,所以變量i已經(jīng)定義。這時(shí)就可以使用watch i=99設(shè)置斷點(diǎn)了。4、查看當(dāng)前設(shè)置的斷點(diǎn)使用info breakpoints命令可以查看當(dāng)前所有的中斷點(diǎn),例如:(gdb) break 7Breakpoint 1 at 0x80483c0: file test.c, line 7.(gdb) break 15 if result=5050Breakpoint 2 at 0x8048405: file test.c, line 15.(gdb) info breakpointsNum Type Disp Enb Address What1 breakpoint keep y 0x080483c0 in get_sum at test.c:72 breakpoint keep y 0x08048405 in main at test.c:15 stop only if result = 5050其中:Num 表示斷點(diǎn)的編號(hào) Type 說(shuō)明類型,類型為breakpoint是指中斷 Disp 指明中斷點(diǎn)在生效一次后是否失去作用,是則為disp,不是則為keep End 說(shuō)明中斷點(diǎn)是否有效,有效則為y,無(wú)效則為n Address列 說(shuō)明中斷所處的內(nèi)存地址 What列 列出中斷發(fā)生在哪個(gè)函數(shù)的第幾行 Stop only if result=5050 說(shuō)明這是一個(gè)條件中斷5、使中斷失效或有效disable 可以使某個(gè)斷點(diǎn)失效,程序運(yùn)行到該斷點(diǎn)時(shí)不會(huì)停下來(lái)而是繼續(xù)運(yùn)行enable 可以使某個(gè)斷點(diǎn)恢復(fù)有效例:(gdb) info breakpointsNum Type Disp Enb Address What1 breakpoint keep y 0x080483c0 in get_sum at test.c:72 breakpoint keep y 0x08048405 in main at test.c:15 stop only if result = 5050(gdb) disable 2(gdb) info breakpointsNum Type Disp Enb Address What1 breakpoint keep y 0x080483c0 in get_sum at test.c:72 breakpoint keep n 0x08048405 in main at test.c:15 stop only if result = 5050(gdb) enable 2(gdb) info breakpointsNum Type Disp Enb Address What1 breakpoint keep y 0x080483c0 in get_sum at test.c:72 breakpoint keep y 0x08048405 in main at test.c:15 stop only if result = 50506、刪除斷點(diǎn)l clear 刪除程序中所有的斷點(diǎn)l clear 刪除此行的斷點(diǎn)l clear 刪除該函數(shù)的斷點(diǎn)l delete 刪除指定編號(hào)的斷點(diǎn)。如果一次要?jiǎng)h除多個(gè)斷點(diǎn),各個(gè)斷點(diǎn)編號(hào)以空格隔開例:(gdb) break 6Breakpoint 1 at 0x80483b1: file test.c, line 6.(gdb) break 7Breakpoint 2 at 0x80483c0: file test.c, line 7.(gdb) break 8 if sum=5050Breakpoint 3 at 0x80483cf: file test.c, line 8.(gdb) info breakpointsNum Type Disp Enb Address What1 breakpoint keep y 0x080483b1 in get_sum at test.c:62 breakpoint keep y 0x080483c0 in get_sum at test.c:73 breakpoint keep y 0x080483cf in get_sum at test.c:8 stop only if sum = 5050(gdb) clear 6Deleted breakpoint 1(gdb) info breakpointsNum Type Disp Enb Address What2 breakpoint keep y 0x080483c0 in get_sum at test.c:73 breakpoint keep y 0x080483cf in get_sum at test.c:8 stop only if sum = 5050(gdb) delete 2 3(gdb) info breakpointsNo breakpoints or watchpoints.7、display 在每次程序停在斷點(diǎn)位置時(shí),自動(dòng)顯示表達(dá)式中的內(nèi)容8、commands 命令 end 結(jié)束命令輸入作用:指定在程序到達(dá)斷點(diǎn)位置時(shí)需要執(zhí)行的調(diào)試器命令五、查看和設(shè)置變量的值當(dāng)程序執(zhí)行到中斷點(diǎn)暫停執(zhí)行時(shí),需要查看變量或表達(dá)式的值,借此了解程序的執(zhí)行狀態(tài)1、 print命令作用:print命令一般用來(lái)打印變量或表達(dá)式的值,也可以用來(lái)打印內(nèi)存中從某個(gè)變量開始的一段 存區(qū)域的內(nèi)容,還可以用來(lái)對(duì)某個(gè)變量進(jìn)行賦值。格式:print 打印變量或表達(dá)式的當(dāng)前值,gdb會(huì)用偽變量($n)來(lái)保存輸出值以備用 Print ; 對(duì)變量進(jìn)行賦值 Print 打印以表達(dá)式值開始的n個(gè)數(shù)例:(gdb) break 7Breakpoint 4 at 0x80483c0: file test.c, line 7.(gdb) runStarting program: /tmp/testBreakpoint 4, get_sum (n=100) at test.c:77 sum += i;(gdb) print in 打印出in表達(dá)式的值,顯然這個(gè)表達(dá)式為真,因此值為1$1 = 1(gdb) print i$2 = 0(gdb) print su

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論