您的位置:首页 > 编程语言 > C语言/C++

一个很有深度的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++ file list c