免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3623 | 回复: 13
打印 上一主题 下一主题

入门的第一个c程序调试问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-18 14:18 |只看该作者 |倒序浏览
程序如下:greeting.c

  1. #include <stdio.h>;
  2. void my_print(char *string);
  3. void my_print2(char *string);

  4. main ()
  5. {
  6.         char my_string[] = "hello there";
  7.         my_print (my_string);
  8.         my_print2 (my_string);
  9. }

  10. void my_print (char *string)
  11. {
  12.         printf ("The string is %s\n", string);
  13. }

  14. void my_print2 (char *string)
  15. {
  16.         char *string2;
  17.         int size, i;
  18.         size = strlen (string);
  19.         string2 = (char *) malloc (size + 1);
  20.         for (i = 0; i < size; i++)
  21.                 string2[size - i] = string[i];
  22.         string2[size+1] = '\0';
  23.         printf ("The string printed backward is %s\n", string2);
  24. }
复制代码


用gcc -g -o greeting greeting.c
正常,执行和网上文章也一样

用gdb greeting,如下
(gdb)break 24就是string2[size - i] = string;所在行
Breakpoint 1 at 0x804847c: fine greeting.c, line 24
(gdb)run
Starting program: /home/iq/program/greeting
The string is hello there

Breakpoint 1, my_print2 (string=0xfef6e7e0 "hello there" at greeting.c:24
24    string2[size - i] = string
(gdb)watch string2[size - i]
Hardware watchpoint 2: string[size - i]
(gdb)next

warning : Could not remove hardware watchpoint
Warning :
Could not insert hardware watchpoint 2.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.


按照网上文章,此步骤应会得到string2[size-i]的值,如下:
Watchpoint 2, string2[size - i]
Old value = 0"\000"
New value = 104"h"
为什么我得到的却是警告信息?

多谢!

论坛徽章:
0
2 [报告]
发表于 2005-04-18 17:07 |只看该作者

入门的第一个c程序调试问题

奇怪 在一台redhat linux 6.1的机器上,gdb可以正常执行
但是在 fedora core 3里面,却不能正常执行。
用gdb监视简单的值可以,比如size,但是监视string2[size - i]就是不行。

论坛徽章:
0
3 [报告]
发表于 2005-04-18 17:28 |只看该作者

入门的第一个c程序调试问题

可能跟Fedora Core 3加载Exec-shield补丁之后有random ring3 stack的特性有关

论坛徽章:
0
4 [报告]
发表于 2005-04-18 18:24 |只看该作者

入门的第一个c程序调试问题

[quote]原帖由 "ayazero"]可能跟Fedora Core 3加载Exec-shield补丁之后有random ring3 stack的特性有关[/quote 发表:


实在看不懂,我怎么这么命苦,写第一个程序就遇到这么复杂的问题。

如果是这个问题,应该怎样确定和解决呀

多谢

论坛徽章:
0
5 [报告]
发表于 2005-04-18 18:44 |只看该作者

入门的第一个c程序调试问题

自己down个新的内核编译一下

论坛徽章:
0
6 [报告]
发表于 2005-04-19 10:36 |只看该作者

入门的第一个c程序调试问题

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 - 1] = string;
   string2[size] = '\0';
   printf ("The string printed backward is %s\n", string2);
}

你的源程序中string2[size+1]越界
即使完成倒序,也会少一个字符

论坛徽章:
0
7 [报告]
发表于 2005-04-19 12:11 |只看该作者

入门的第一个c程序调试问题

原帖由 "hust_tulip" 发表:
浇?
即使完成倒序,也会少一个字符


这个程序就是个有错误的程序,我看的文章讲的就是用gdb调试它。

论坛徽章:
0
8 [报告]
发表于 2005-04-21 16:05 |只看该作者

入门的第一个c程序调试问题

[quote]原帖由 "ayazero"]自己down个新的内核编译一下[/quote 发表:

已经升级到了2.6.11,还是不行。



另外,说程序有错误的,看看这篇文章
http://blog.chinaunix.net/article.php?articleId=11600&blogId=3965
错误是故意的,目的就是调试。
即便把程序改正确了,还是不行



试验了redhat 6.1、redhat 9、fedora core 1,都没有问题
只有fedora core 3有这个问题。

那位老大有时间试验一下,帮帮我,多谢!

论坛徽章:
0
9 [报告]
发表于 2005-04-21 16:13 |只看该作者

入门的第一个c程序调试问题

gcc版本 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
gdb版本 6.1post-2.20040607.41rh

另外,监视string2[size]、监视size - i都没有问题,只有监视string2[size-i]时出现问题

监视string2[size-i-1]时,问题同样会出现

论坛徽章:
0
10 [报告]
发表于 2005-04-21 16:49 |只看该作者

入门的第一个c程序调试问题

我在freebsd5.4下也出现同样的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP