现在的位置: 首页 > 综合 > 正文

一个很有深度的C++内存问题—GDB调试(一)

2019年08月11日 ⁄ 综合 ⁄ 共 2100字 ⁄ 字号 评论关闭

先看代码(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) 

最后看图解:

抱歉!评论已关闭.