<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/257147.htm

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

          1.目的

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

          2.內(nèi)容

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

          #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”選項以方便之后的調(diào)試。

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

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

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

          3.步驟

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

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

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

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

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

          TheoriginalstringisEmbedded

          Thestringafterwardis

          可見,該程序沒有能夠倒序輸出。

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

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

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

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

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

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

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

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

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

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

          (16)程序在printf前停止運(yùn)行,此時依次查看string2[0]、string2[1]…,發(fā)現(xiàn)string[0]沒有被正確賦值,而后面的賦值都是正確的,這時,定位程序第31行,發(fā)現(xiàn)程序運(yùn)行結(jié)果錯誤的原因在于“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

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

          4.實驗結(jié)果

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

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


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

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();