Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149812
  • 博文数量: 23
  • 博客积分: 546
  • 博客等级: 中士
  • 技术积分: 608
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-02 18:04
文章分类

全部博文(23)

文章存档

2012年(23)

我的朋友

分类: LINUX

2012-07-03 09:28:53

断点调试:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int sum = 0, i = 0;
  5.         char input[5];

  6.         while(1)
  7.                 {
  8.                         sum = 0;
  9.                         scanf("%s",input);
  10.                         for(i=0; input[i]!='\0'; ++i)
  11.                                 sum = sum*10 + input[i] - '0';
  12.                         printf("input=%d\n", sum);
  13.                 }
  14.         return 0;
  15. }
这个程序就是把字符串转换成数值,编译运行程序后:

点击(此处)折叠或打开

  1. $ gcc atoi.c -g -o atoi
  2. $ ./atoi
  3. 123
  4. input=123
  5. 234
  6. input=123234
第一次结果正确,但是第二次并不正确,还是用gdb来调试。
下面是gdb调试的过程

点击(此处)折叠或打开

  1. [tym@lxy gdb]$ gdb atoi
  2. GNU gdb Fedora (6.8-37.el5)
  3. Copyright (C) 2008 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  5. This is free software: you are free to change and redistribute it.
  6. There is NO WARRANTY, to the extent permitted by law. Type "show copying"
  7. and "show warranty" for details.
  8. This GDB was configured as "i386-redhat-linux-gnu"...
  9. (gdb) l
  10. 1 #include <stdio.h>
  11. 2
  12. 3 int main()
  13. 4 {
  14. 5 int sum = 0, i = 0;
  15. 6 char input[5];
  16. 7
  17. 8 while(1)
  18. 9 {
  19. 10 scanf("%s",input);
  20. (gdb) l
  21. 11 for(i=0; input[i]!='\0'; ++i)
  22. 12 sum = sum*10 + input[i] - '0';
  23. 13 printf("input=%d\n", sum);
  24. 14 }
  25. 15 return 0;
  26. 16 }
  27. (gdb) b 10
  28. Breakpoint 1 at 0x80483d3: file atoi.c, line 10.
  29. (gdb) b 12
  30. Breakpoint 2 at 0x80483ef: file atoi.c, line 12.
  31. (gdb) run
  32. Starting program: /home/tym/source/gdb/atoi

  33. Breakpoint 1, main () at atoi.c:10
  34. 10 scanf("%s",input);
  35. (gdb) i locals
  36. sum = 0
  37. i = 0
  38. input = "S"
  39. (gdb) n
  40. 123
  41. 11 for(i=0; input[i]!='\0'; ++i)
  42. (gdb) n

  43. Breakpoint 2, main () at atoi.c:12
  44. 12 sum = sum*10 + input[i] - '0';
  45. (gdb) n
  46. 11 for(i=0; input[i]!='\0'; ++i)
  47. (gdb) n

  48. Breakpoint 2, main () at atoi.c:12
  49. 12 sum = sum*10 + input[i] - '0';
  50. (gdb) n
  51. 11 for(i=0; input[i]!='\0'; ++i)
  52. (gdb) i locals
  53. sum = 1
  54. i = 0
  55. input = "123\000"
  56. (gdb) n

  57. Breakpoint 2, main () at atoi.c:12
  58. 12 sum = sum*10 + input[i] - '0';
  59. (gdb) i locals
  60. sum = 1
  61. i = 1
  62. input = "123\000"
  63. (gdb) n
  64. 11 for(i=0; input[i]!='\0'; ++i)
  65. (gdb) n

  66. Breakpoint 2, main () at atoi.c:12
  67. 12 sum = sum*10 + input[i] - '0';
  68. (gdb) i locals
  69. sum = 12
  70. i = 2
  71. input = "123\000"
  72. (gdb) n
  73. 11 for(i=0; input[i]!='\0'; ++i)
  74. (gdb) n
  75. 13 printf("input=%d\n", sum);
  76. (gdb) locals
  77. Undefined command: "locals". Try "help".
  78. (gdb) i locals
  79. sum = 123
  80. i = 3
  81. input = "123\000"
  82. (gdb) n
  83. input=123
  84. 14 }
  85. (gdb) n

  86. Breakpoint 1, main () at atoi.c:10
  87. 10 scanf("%s",input);
  88. (gdb) n
  89. 234
  90. 11 for(i=0; input[i]!='\0'; ++i)
  91. (gdb) n

  92. Breakpoint 2, main () at atoi.c:12
  93. 12 sum = sum*10 + input[i] - '0';
  94. (gdb) i locals
  95. sum = 123
  96. i = 0
  97. input = "234\000"
在123行你看出来在第二次输入input时,你看到sum的值并不是空的,而是上次结果,所以程序的问题就暴露出来了。
 
下面介绍本章的命令及别的命令:
命令 描述
break(或b) 行号 在某一行设置断点
break 函数名 在某个函数开头设置断点
break ... if ... 设置条件断点
continue(或c) 从当前位置开始连续运行程序
delete breakpoints 断点号 删除断点
display 变量名 跟踪查看某个变量,每次停下来都显示它的值
disable breakpoints 断点号 禁用断点
enable 断点号 启用断点
info(或i) breakpoints 查看当前设置了哪些断点
run(或r) 从头开始连续运行程序
undisplay 跟踪显示号 取消跟踪显示


 

我们还应该记得,我们使用gdb进入gdb的命令提示符,如果想使用shell命令,我们应该在gdb的命令提示符下输入shell  shell_command
阅读(877) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~