Linux用GDB调试结构体的全值

[个人原创]Linux用GDB调试时如何打印数组,结构体的全值打印及其修改或加入变量调试。  不指定

WEB2.0 »  Unix&Linux技术  root 2011-9-1 12:58  评论(0)  阅读(3372)   大 | 中 | 小  
WEB2.0 »  Unix&Linux技术 |  评论(0) |  引用(0) |  阅读(3372)
一.调试打印C程序中的数组的方法
view plain print ?
  1. (gdb) l 23  
  2. Line number 18 out of range; array.c has 17 lines.  
  3. 发现共才17行,于是用下面命令:  
  4. (gdb) l 1,17  
  5. 1       #include <stdio.h>  
  6. 2       #include <stdlib.h>  
  7. 3       int main()  
  8. 4       {  
  9. 5               int i;  
  10. 6               int len=5;  
  11. 7               int *array;  
  12. 8               array = (int *) malloc (len * sizeof (int));  
  13. 9               for(i=0;i<len;i++)  
  14. 10              {  
  15. 11                      //scanf("%d",array+i);  
  16. 12                      *(array+i) = i;  
  17. 13              }  
  18. 14              printf("The Result Value is :\n");  
  19. 15              for(i=0;i<len;i++)  
  20. 16              printf("%d\n",*(array++));  
  21. 17      }  
  22.   
  23. (gdb) b 14  
  24. Breakpoint 1 at 0x8048452: file array.c, line 14.  
  25. (gdb) r  
  26. Starting program: /home/admin/c++/array  
  27.   
  28. Breakpoint 1, main () at array.c:14  
  29. 14              printf("The Result Value is :\n");  
  30. (gdb) p *array@5  
  31. $1 = {0, 1, 2, 3, 4}  

二.打印C程序中的结构体的方法
view plain print ?
  1. [email protected]:/home/admin/c++# cat struct.c  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. typedef struct cfg  
  5. {  
  6.  int type;  
  7.  char name[12];  
  8. } man;  
  9. int main()  
  10. {  
  11.         man oneperson;  
  12.         oneperson.type = 1;  
  13.         char name[12]="jack";  
  14.         strcpy(oneperson.name,name);  
  15.         printf("jackxiang\n");  
  16.         printf("jackxiang\n");  
  17. }  


打印整个结构体:
view plain print ?
  1. (gdb) p oneperson  
  2. $1 = {type = 1name = "jack\000\217\306\000\220\065\260"}  


打结构体中的某个值:
view plain print ?
  1. (gdb) p oneperson->type  
  2. $2 = 1  
  3. (gdb) p oneperson->name  
  4. $3 = "jack\000\217\306\000\220\065\260"  
  5. (gdb) p oneperson  
  6. $1 = {type = 1name = "jack\000\217\306\000\220\065\260"}  


如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。如: 
view plain print ?
  1. (gdb) set print pretty on  
  2. (gdb) print oneperson  
  3. $1 = {  
  4.   type = 1,  
  5.   name = "jack\000\217\306\000\220\065\260"  
  6. }  
  7. [codes=html]  
  8.   
  9. 三.在GDB中加入变量调试For循环中的数组的方法:  
  10. [codes=html]  
  11. (gdb) p oneperson.name  
  12. $2 = "jack\000\217\306\000\220\065\260"  
  13. (gdb) p oneperson->name  
  14. $3 = "jack\000\217\306\000\220\065\260"  
  15.   
  16. (gdb) l  
  17. 1       #include <stdio.h>  
  18. 2       int w[4] = {12,5,8,29};  
  19. 3       main()  
  20. 4       {  
  21. 5          w[2] = 88;  
  22. 6       }  
  23. (gdb) b 6  
  24. Breakpoint 1 at 0x804838c: file set.c, line 6.  
  25. (gdb) r  
  26. Starting program: /home/admin/c++/set  
  27.   
  28. Breakpoint 1, main () at set.c:6  
  29. 6       }  
  30. (gdb) set $i = 0  
  31. (gdb) p w[$i]  
  32. $1 = 12  
  33. (gdb) p w[$i++]  
  34. $2 = 12  
  35. (gdb) p w[$i]  
  36. $3 = 5  
  37. (gdb) p w[$i++]  
  38. $4 = 5  
  39. (gdb) p w[$i]  
  40. $5 = 88  

四.修改变量的值
view plain print ?
  1. (gdb) p w[2]  
  2. $6 = 88  
  3. (gdb) p w[2]=99  
  4. $7 = 99  
  5. (gdb) p w[2]  
  6. $8 = 99  


他人实践:http://wenku.baidu.com/view/77cbd54f767f5acfa1c7cdda.html
GDB个人总结下载:
下载文件
点击这里下载文件


参看:http://wiki.ubuntu.org.cn/index.php?title=%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F&variant=zh-cn
本站参考:
http://justwinit.cn/post/4014/
http://justwinit.cn/post/757/

使用 GDB 调试多进程程序:
http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/
http://tieba.baidu.com/f?kz=874502809
http://blog.163.com/redhumor@126/blog/static/1955478420108192540752/

你可能感兴趣的:(Linux用GDB调试结构体的全值)