当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]gdb调试问题,不显示watch观察的变量值
帖子发表于 : 2007-09-11 23:38 
头像

注册: 2007-05-14 3:51
帖子: 18
地址: 湖南
送出感谢: 0 次
接收感谢: 0 次
我是按照后面的例子来做的:问题是下面这部分信息
代码:
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++)


_________________
阿特曼的山沟沟


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-09-12 12:06 
头像

注册: 2007-05-14 3:51
帖子: 18
地址: 湖南
送出感谢: 0 次
接收感谢: 0 次
有人看没人答吗??


_________________
阿特曼的山沟沟


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-09-12 23:14 

注册: 2007-01-22 21:02
帖子: 18
送出感谢: 0 次
接收感谢: 0 次
for (i = 0; i < size; i++) string2[size - i-1] = string[i];
string2[size] = `\0';

改成这样 你试试


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-09-13 12:08 
头像

注册: 2007-05-14 3:51
帖子: 18
地址: 湖南
送出感谢: 0 次
接收感谢: 0 次
谢谢楼上的回答,我本来就知道程序有问题,我的意思是要学着用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本身有问题,不过前者的可能性很大,我现在找不出我操作上的问题,想请大家在自己的机器上试一下,看能不能找出问题的原因所在。


_________________
阿特曼的山沟沟


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-08-12 15:23 

注册: 2008-08-12 10:48
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
watch 查看变量时只要变量的值有变化就停止
执行时不要用n,用c执行就会显示出变量的变化情况。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译