新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux下C編程基礎(chǔ)之:實(shí)驗(yàn)內(nèi)容

        Linux下C編程基礎(chǔ)之:實(shí)驗(yàn)內(nèi)容

        作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/257147.htm

        3.7.2用gdb調(diào)試程序的bug

        1.目的

        通過(guò)調(diào)試一個(gè)有問(wèn)題的程序,使讀者進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過(guò)對(duì)有問(wèn)題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問(wèn)題和解決問(wèn)題的能力。這是一個(gè)很小的程序,只有35行,希望讀者認(rèn)真調(diào)試。

        2.內(nèi)容

        (1)使用vi編輯器,將以下代碼輸入到名為greet.c的文件中。此代碼的原意為輸出倒序main函數(shù)中定義的字符串,但結(jié)果顯示沒(méi)有輸出。代碼如下所示:

        #includestdio.h>

        intdisplay1(char*string);

        intdisplay2(char*string);

        intmain()

        {

        charstring[]=Embedded;

        display1(string);

        display2(string);

        }

        intdisplay1(char*string)

        {

        printf(Theoriginalstringis%sn,string);

        }

        intdisplay2(char*string1)

        {

        char*string2;

        intsize,i;

        size=strlen(string1);

        string2=(char*)malloc(size+1);

        for(i=0;isize;i++)

        {

        string2[size-i]=string1[i];

        }

        string2[size+1]='';

        printf(Thestringafterwardis%sn,string2);

        }

        (2)使用gcc編譯這段代碼,注意要加上“-g”選項(xiàng)以方便之后的調(diào)試。

        (3)運(yùn)行生成的可執(zhí)行文件,觀察運(yùn)行結(jié)果。

        (4)使用gdb調(diào)試程序,通過(guò)設(shè)置斷點(diǎn)、單步跟蹤,一步步找出錯(cuò)誤所在。

        (5)糾正錯(cuò)誤,更改源程序并得到正確的結(jié)果。

        3.步驟

        (1)在工作目錄上新建文件greet.c,并用vi啟動(dòng):vigreet.c。

        (2)在vi中輸入以上代碼。

        (3)在vi中保存并退出,使用命令“:wq”。

        (4)用gcc編譯:gcc-ggreet.c-ogreet。

        (5)運(yùn)行g(shù)reet,使用命令“./greet”,輸出為:

        TheoriginalstringisEmbedded

        Thestringafterwardis

        可見(jiàn),該程序沒(méi)有能夠倒序輸出。

        (6)啟動(dòng)gdb調(diào)試:gdbgreet。

        (7)查看源代碼,使用命令“l”。

        (8)在30行(for循環(huán)處)設(shè)置斷點(diǎn),使用命令“b30”。

        (9)在33行(printf函數(shù)處)設(shè)置斷點(diǎn),使用命令“b33”。

        (10)查看斷點(diǎn)設(shè)置情況,使用命令“infob”。

        (11)運(yùn)行代碼,使用命令“r”。

        (12)單步運(yùn)行代碼,使用命令“n”。

        (13)查看暫停點(diǎn)變量值,使用命令“pstring2[size-i]”。

        (14)繼續(xù)單步運(yùn)行代碼數(shù)次,并檢查string2[size-1]的值是否正確。

        (15)繼續(xù)程序的運(yùn)行,使用命令“c”。

        (16)程序在printf前停止運(yùn)行,此時(shí)依次查看string2[0]、string2[1]…,發(fā)現(xiàn)string[0]沒(méi)有被正確賦值,而后面的賦值都是正確的,這時(shí),定位程序第31行,發(fā)現(xiàn)程序運(yùn)行結(jié)果錯(cuò)誤的原因在于“size-1”。由于i只能增到“size-1”,這樣string2[0]就永遠(yuǎn)不能被賦值而保持NULL,故不能輸出任何結(jié)果。

        (17)退出gdb,使用命令“q”。

        (18)重新編輯greet.c,把其中的“string2[size-i]=string1[i]”改為“string2[size–i-1]=string1[i];”即可。

        (19)使用gcc重新編譯:gcc-ggreet.c-ogreet。

        (20)查看運(yùn)行結(jié)果:./greet

        TheoriginalstringisEmbedded

        ThestringafterwardisxuniLdeddedbmE

        這時(shí),輸出結(jié)果正確。

        4.實(shí)驗(yàn)結(jié)果

        將原來(lái)有錯(cuò)的程序經(jīng)過(guò)gdb調(diào)試,找出問(wèn)題所在,并修改源代碼,輸出正確的倒序顯示字符串的結(jié)果。

        linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


        關(guān)鍵詞: C編程 實(shí)驗(yàn) Linux VI

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 老河口市| 岑巩县| 建始县| 仙游县| 北宁市| 区。| 宁城县| 逊克县| 锡林浩特市| 佛冈县| 黄石市| 东海县| 同仁县| 浏阳市| 门头沟区| 长阳| 黄石市| 乌苏市| 岱山县| 旬邑县| 鄄城县| 中宁县| 馆陶县| 石首市| 大理市| 河间市| 铁岭县| 金溪县| 泌阳县| 那坡县| 普定县| 甘德县| 龙陵县| 清镇市| 万源市| 广水市| 东宁县| 宽甸| 屏山县| 兴国县| 台东市|