本節(jié)用一個(gè)實(shí)例教你一步步的用 gdb 調(diào)試程序. 被調(diào)試的程序相當(dāng)?shù)暮唵? 但它展示了 gdb 的典型應(yīng)用.
static void my_print2 (char *);
{?
char my_string[] = "hello world!";?
my_print (my_string);?
my_print2 (my_string);?
}
{?
printf ("The string is %s ", string);?
}
{?
char *string2;?
int size, i;
string2 = (char *) malloc (size + 1);?
for (i = 0; i < size; i++)?
string2[size - i] = string;?
string2[size+1] = '';
這個(gè)程序執(zhí)行時(shí)顯示如下結(jié)果:?
../hello?
The string is hello world!
輸出的第一行是正確的, 但第二行打印出的東西并不是我們所期望的. 我們所設(shè)想的輸出?
應(yīng)該是:
由于某些原因, my_print2 函數(shù)沒有正常工作. 讓我們用 gdb 看看問題究竟出在哪兒,?
先鍵入如下命令:
--
--
file 命令來載入它:
這個(gè)命令將載入 hello 可執(zhí)行文件就象你在 gdb 命令行里裝入它一樣.
這個(gè)輸出和在 gdb 外面運(yùn)行的結(jié)果一樣. 問題是, 為什么反序打印沒有工作? 為了找出癥結(jié)所在, 我們可以在 my_print2 函數(shù)的 for 語句后設(shè)一個(gè)斷點(diǎn), 具體的做法是在 gdb?
提示符下鍵入 list 命令三次, 列出源代碼:
--
--
2?
3 static void my_print (char *);?
4 static void my_print2 (char *);?
5?
6 main ()?
7 {?
8 char my_string[] = "hello world!";?
9 my_print (my_string);?
10 my_print2 (my_string);
12?
13 void my_print (char *string)?
14 {?
15 printf ("The string is %s ", string);?
16 }?
17?
18 void my_print2 (char *string)?
19 {?
20 char *string2;?
再按一次回車將列出 hello 程序的剩余部分:
22?
23 size = strlen (string);?
24 string2 = (char *) malloc (size + 1);?
25 for (i = 0; i < size; i++)?
26 string2[size - i] = string;?
27 string2[size+1] = '';?
28?
29 printf ("The string printed backward is %s ", string2);?
30 }?
根據(jù)列出的源程序, 你能看到要設(shè)斷點(diǎn)的地方在第26行, 在 gdb 命令行提示符下鍵入如下命令設(shè)置斷點(diǎn):
gdb 將作出如下的響應(yīng):
26 string2[size - i] = string;?
你能通過設(shè)置一個(gè)觀察 string2[size - i] 變量的值的觀察點(diǎn)來看出錯(cuò)誤是怎樣產(chǎn)生的,?
做法是鍵入:
gdb 將作出如下回應(yīng):
現(xiàn)在可以用 next 命令來一步步的執(zhí)行 for 循環(huán)了:
經(jīng)過第一次循環(huán)后, gdb 告訴我們 string2[size - i] 的值是 `h`. gdb 用如下的顯示來告訴你這個(gè)信息:
New value = 104 'h'?
my_print2 (string=0xbffffab0 "hello world!") at hello.c:25?
25 for (i = 0; i < size; i++)?
這個(gè)值正是期望的. 后來的數(shù)次循環(huán)的結(jié)果都是正確的. 當(dāng) i=11 時(shí), 表達(dá)式?
string2[size - i] 的值等于 `!`, size - i 的值等于 1, 最后一個(gè)字符已經(jīng)拷到新串里了.
static void my_print2 (char *);
{?
char my_string[] = "hello world!";?
my_print (my_string);?
my_print2 (my_string);?
}
{?
printf ("The string is %s ", string);?
}
{?
char *string2;?
int size, i;
string2 = (char *) malloc (size + 1);?
for (i = 0; i < size; i++)?
string2[size -1 - i] = string;?
string2[size] = '';
}?
如果程序產(chǎn)生了core文件,可以用gdb hello core命令來查看程序在何處出錯(cuò)。如在函數(shù)my_print2()中,如果忘記了給string2分配內(nèi)存 string2 = (char *) malloc (size + 1);,很可能就會 core dump.
評論