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

一个很有深度的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)

最后看图解:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: