一个很有深度的C++内存问题---GDB调试(一)
2011-11-10 11:32
369 查看
先看代码(a.c):
再看调试情况:
最后看图解:
#include <stdio.h> int main(int argc, char* argv[]) { int a[4]={1,2,3,4}; int *ptr1=(int*)(&a+1); int *ptr2=(int*)((int)a+1); int *ptr3=(int*)(a+1); printf("a = %x, &a = %x, &a+1 = %x, (int)a+1 = %x\n", a, &a, &a+1, (int)a+1); printf("ptr1 = %x, ptr2 = %x, ptr3 = %x, &ptr1[-1] = %x\n", ptr1, ptr2, ptr3, &ptr1[-1]); printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3); return 0; }
再看调试情况:
[zcm@t #81]$make clean rm -f *.o a [zcm@t #82]$make gcc -g -c -o a.o a.c gcc -g -o a a.o [zcm@t #83]$gdb a GNU gdb (GDB) Fedora (7.0-3.fc12) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /mnt/hgfs/Linux_Share/t/a...done. (gdb) list 1 #include <stdio.h> 2 3 int main(int argc, char* argv[]) 4 { 5 int a[4]={1,2,3,4}; 6 int *ptr1=(int*)(&a+1); 7 int *ptr2=(int*)((int)a+1); 8 int *ptr3=(int*)(a+1); 9 printf("a = %x, &a = %x, &a+1 = %x, (int)a+1 = %x\n", a, &a, &a+1, (int)a+1); 10 printf("ptr1 = %x, ptr2 = %x, ptr3 = %x, &ptr1[-1] = %x\n", ptr1, ptr2, ptr3, &ptr1[-1]); (gdb) list 11 printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3); 12 13 return 0; 14 }(gdb) b 5 Breakpoint 1 at 0x80483ce: file a.c, line 5. (gdb) b 11 Breakpoint 2 at 0x8048472: file a.c, line 11. (gdb) b 13 Breakpoint 3 at 0x80484a0: file a.c, line 13. (gdb) run Starting program: /mnt/hgfs/Linux_Share/t/a Breakpoint 1, main (argc=1, argv=0xbffff2f4) at a.c:5 5 int a[4]={1,2,3,4}; Missing separate debuginfos, use: debuginfo-install glibc-2.11-2.i686 (gdb) c Continuing. a = bffff214, &a = bffff214, &a+1 = bffff224, (int)a+1 = bffff215 ptr1 = bffff224, ptr2 = bffff215, ptr3 = bffff218, &ptr1[-1] = bffff220 Breakpoint 2, main (argc=1, argv=0xbffff2f4) at a.c:11 11 printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3); (gdb) c Continuing. ptr1[-1] = 4, *ptr2 = 2000000, *ptr3 = 2 Breakpoint 3, main (argc=1, argv=0xbffff2f4) at a.c:13 13 return 0; (gdb) x /24xb a 0xbffff214: 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0xbffff21c: 0x03 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0xbffff224: 0x24 0xf2 0xff 0xbf 0x15 0xf2 0xff 0xbf (gdb)
最后看图解:
相关文章推荐
- 一个很有深度的C++内存问题---GDB调试(一)
- gdb调试info threads只能显示一个进程问题
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- GDB 多线程调试基本命令和一个实例问题的解决(转贴)
- 程序内存或CPU异常增长问题的一个调试分析方法
- 一个诡异的C++内存泄露问题。
- Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)
- zz一个VS2005无法调试C++的问题
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)
- 一个VS2005无法调试C++的问题
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- 一个C C++ 内存的问题 和 C++继承 虚函数表的点【2013.10.15小记】
- GDB调试和NATIVE内存问题分析整理
- gdb调试程序中遇到的一个问题
- Eclipse 在 Mac OS X 上调试 c/c++ 的一个问题
- zz一个VS2005无法调试C++的问题
- C++。memory leak检查办法。一个当内存分配后未回收(或导致各种问题)的检查办法
- Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)