Linux下C編程基礎之:實驗內容
3.7.2用gdb調試程序的bug
1.實驗目的
通過調試一個有問題的程序,使讀者進一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調試命令,通過對有問題程序的跟蹤調試,進一步提高發(fā)現問題和解決問題的能力。這是一個很小的程序,只有35行,希望讀者認真調試。
2.實驗內容
(1)使用vi編輯器,將以下代碼輸入到名為greet.c的文件中。此代碼的原意為輸出倒序main函數中定義的字符串,但結果顯示沒有輸出。代碼如下所示:
#includestdio.h>
intdisplay1(char*string);
intdisplay2(char*string);
intmain()
{
charstring[]=EmbeddedLinux;
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”選項以方便之后的調試。
(3)運行生成的可執(zhí)行文件,觀察運行結果。
(4)使用gdb調試程序,通過設置斷點、單步跟蹤,一步步找出錯誤所在。
(5)糾正錯誤,更改源程序并得到正確的結果。
3.實驗步驟
(1)在工作目錄上新建文件greet.c,并用vi啟動:vigreet.c。
(2)在vi中輸入以上代碼。
(3)在vi中保存并退出,使用命令“:wq”。
(4)用gcc編譯:gcc-ggreet.c-ogreet。
(5)運行greet,使用命令“./greet”,輸出為:
TheoriginalstringisEmbeddedLinux
Thestringafterwardis
可見,該程序沒有能夠倒序輸出。
(6)啟動gdb調試:gdbgreet。
(7)查看源代碼,使用命令“l”。
(8)在30行(for循環(huán)處)設置斷點,使用命令“b30”。
(9)在33行(printf函數處)設置斷點,使用命令“b33”。
(10)查看斷點設置情況,使用命令“infob”。
(11)運行代碼,使用命令“r”。
(12)單步運行代碼,使用命令“n”。
(13)查看暫停點變量值,使用命令“pstring2[size-i]”。
(14)繼續(xù)單步運行代碼數次,并檢查string2[size-1]的值是否正確。
(15)繼續(xù)程序的運行,使用命令“c”。
(16)程序在printf前停止運行,此時依次查看string2[0]、string2[1]…,發(fā)現string[0]沒有被正確賦值,而后面的賦值都是正確的,這時,定位程序第31行,發(fā)現程序運行結果錯誤的原因在于“size-1”。由于i只能增到“size-1”,這樣string2[0]就永遠不能被賦值而保持NULL,故不能輸出任何結果。
(17)退出gdb,使用命令“q”。
(18)重新編輯greet.c,把其中的“string2[size-i]=string1[i]”改為“string2[size–i-1]=string1[i];”即可。
(19)使用gcc重新編譯:gcc-ggreet.c-ogreet。
(20)查看運行結果:./greet
TheoriginalstringisEmbeddedLinux
ThestringafterwardisxuniLdeddedbmE
這時,輸出結果正確。
4.實驗結果
將原來有錯的程序經過gdb調試,找出問題所在,并修改源代碼,輸出正確的倒序顯示字符串的結果。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論