代码: 全选
Watchpoint 2, string2[size - i]
Old value = 0 `\000'
New value = 104 `h'
my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23
23 for (i=0; i<size; i++)
我用的ubuntu版本是6.06LTS版。
例子:
下面列出了将被调试的程序. 这个程序被称为greeting , 它显示一个简单的问候, 再用反序将它列出.代码: 全选
#include <stdio.h> main () { char my_string[] = "hello there"; my_print (my_string); my_print2 (my_string); } void my_print (char *string) { printf ("The string is %s\n", string); } void my_print2 (char *string) { char *string2; int size, i; size = strlen (string); string2 = (char *) malloc (size + 1); for (i = 0; i < size; i++) string2[size - i] = string[i]; string2[size+1] = `\0'; printf ("The string printed backward is %s\n", string2); }
用下面的命令编译它:这个程序执行时显示如下结果:代码: 全选
gcc -g -o test test.c
输出的第一行是正确的, 但第二行打印出的东西并不是我所期望的. 我所设想的输出应该是:代码: 全选
The string is hello there The string printed backward is
由于某些原因, my_print2 函数没有正常工作. 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令:代码: 全选
The string printed backward is ereht olleh
用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里被运行后结果如下:代码: 全选
gdb greeting
这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:代码: 全选
(gdb) run Starting program: /root/greeting The string is hello there The string printed backward is Program exited with code 041
第一次键入 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
再按一次回车将列出 greeting 程序的剩余部分:代码: 全选
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
根据列出的源程序, 要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:代码: 全选
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 }
gdb 将作出如下的响应:代码: 全选
(gdb) break 24
代码: 全选
Breakpoint 1 at 0x139: file greeting.c, line 24 (gdb)
现在再键入 run 命令, 将产生如下的输出:
通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入:代码: 全选
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]
gdb 将作出如下回应:代码: 全选
(gdb) watch string2[size - i]
现在可以用 next 命令来一步步的执行 for 循环了:代码: 全选
Watchpoint 2: string2[size - i]
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:代码: 全选
(gdb) next
代码: 全选
Watchpoint 2, string2[size - i] Old value = 0 `\000' New value = 104 `h' my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23 23 for (i=0; i<size; i++)