[问题]gdb调试问题,不显示watch观察的变量值

C、C++和Java语言
回复
头像
RealTwo
帖子: 18
注册时间: 2007-05-14 3:51
来自: 湖南
送出感谢: 0
接收感谢: 0
联系:

[问题]gdb调试问题,不显示watch观察的变量值

#1

帖子 RealTwo » 2007-09-11 23:38

我是按照后面的例子来做的:问题是下面这部分信息

代码: 全选

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++)
并没有看到,我反复试了好几次,也用了多次next命令,都看不到,这是什么原因??
我用的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
输出的第一行是正确的, 但第二行打印出的东西并不是我所期望的. 我所设想的输出应该是:

代码: 全选

The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作. 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令:

代码: 全选

gdb greeting
用 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
第一次键入 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[size - i]
gdb 将作出如下回应:

代码: 全选

Watchpoint 2: string2[size - i]
现在可以用 next 命令来一步步的执行 for 循环了:

代码: 全选

(gdb) next
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`. gdb 用如下的显示来告诉你这个信息:

代码: 全选

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++)
阿特曼的山沟沟
头像
RealTwo
帖子: 18
注册时间: 2007-05-14 3:51
来自: 湖南
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 RealTwo » 2007-09-12 12:06

有人看没人答吗??
阿特曼的山沟沟
xibaluma
帖子: 18
注册时间: 2007-01-22 21:02
送出感谢: 0
接收感谢: 0

#3

帖子 xibaluma » 2007-09-12 23:14

for (i = 0; i < size; i++) string2[size - i-1] = string;
string2[size] = `\0';

改成这样 你试试
头像
RealTwo
帖子: 18
注册时间: 2007-05-14 3:51
来自: 湖南
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 RealTwo » 2007-09-13 12:08

谢谢楼上的回答,我本来就知道程序有问题,我的意思是要学着用gdb把这个问题调试出来,但是调试的时候,当我用

代码: 全选

watch string2[size - i]
建立一个观察点,然后用next命令逐行运行时,看不到string2[size - i]的值,即gdb并不显示下面这个信息:

代码: 全选

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++)
而我从一些文章上看到,应该会显示这些信息的,所以我不知道是我操作上有问题,还是gdb本身有问题,不过前者的可能性很大,我现在找不出我操作上的问题,想请大家在自己的机器上试一下,看能不能找出问题的原因所在。
阿特曼的山沟沟
shine7758
帖子: 1
注册时间: 2008-08-12 10:48
送出感谢: 0
接收感谢: 0

#5

帖子 shine7758 » 2008-08-12 15:23

watch 查看变量时只要变量的值有变化就停止
执行时不要用n,用c执行就会显示出变量的变化情况。
回复

回到 “C/C++/Java”