一个很有深度的C++内存问题---GDB调试(一)
2012-04-16 16:36
405 查看
先看代码(a.c):
[cpp] view
plaincopy
#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;
}
再看调试情况:
[plain] view
plaincopy
[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)
最后看图解:
[cpp] view
plaincopy
#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;
}
再看调试情况:
[plain] view
plaincopy
[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调试(一)
- zz一个VS2005无法调试C++的问题
- gdb调试程序中遇到的一个问题
- Eclipse 在 Mac OS X 上调试 c/c++ 的一个问题
- GDB调试和NATIVE内存问题分析整理
- C++。memory leak检查办法。一个当内存分配后未回收(或导致各种问题)的检查办法
- Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- GDB 多线程调试基本命令和一个实例问题的解决(转贴)
- gdb调试info threads只能显示一个进程问题
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- 程序内存或CPU异常增长问题的一个调试分析方法
- Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)
- zz一个VS2005无法调试C++的问题
- Eclipse - CDT使用GDB调试C++的问题-无源文件命名(No source file named)
- 一个C C++ 内存的问题 和 C++继承 虚函数表的点【2013.10.15小记】
- 一个诡异的C++内存泄露问题。
- 一个VS2005无法调试C++的问题
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?