he string printed backward is ereht olleh 由于某些原因, my_print2 函数没有正常工作. 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令: gdb greeting 注意: 记得在编译 greeting 程序时把调试选项打开. 如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它: (gdb) file greeting 这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样. 这时你能用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里被运行后结果大约会象这样:(gdb) run
Starting program: /root/greeting
The string is hello there
The string printed backward is
Program exited with code 041 这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印没有工作 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:(gdb) list
(gdb) list
(gdb) list 技巧: 在 gdb 提示符下按回车健将重复上一个命令. 第一次键入 list 命令的输出如下: 1 #include <stdio.h>
2
3 main ()
4 {
5 char my_string[] = "hello there";
6
7 my_print (my_string);
8 my_print2 (my_string);
9 }
10 如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出: 11 my_print (char *string)
12 {
13 printf ("The string is %s\n", string);
14 }
15
16 my_print2 (char *string)
17 {
18 char *string2;
19 int size, i;
20 再按一次回车将列出 greeting 程序的剩余部分:21 size = strlen (string);
22 string2 = (char *) malloc (size + 1);
23 for (i = 0; i < size; i++)
24 string2[size - i] = string[i];
25 string2[size+1] = `\0';
26 printf ("The string printed backward is %s\n", string2);
27 } 根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:(gdb) break 24 gdb 将作出如下的响应:Breakpoint 1 at 0x139: file greeting.c, line 24
(gdb) 现在再键入 run 命令, 将产生如下的输出: Starting program: /root/greeting
The string is hello there
Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :24
24 string2[size-i]=string[i] 你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入: (gdb) watch string2 |