09GDB查看内存分布
说明:
gdb中使用“x
”命令来打印内存的值,格式为“x/nfu addr
”。含义为以f
格式打印从addr
开始的n
个长度单元为u
的内存值。参数具体含义如下:
a)n:输出单元的个数。
b)f:是输出格式。比如x
是以16进制形式输出,o
是以8进制形式输出,等等。
c)u:标明一个单元的长度。b
是一个byte
,h
是两个byte
(halfword),w
是四个byte
(word),g
是八个byte
(giant word)。
例如打印连续的4个整数的内存:x / 4dw ptr
其中ptr是连续内存的首地址,d表示的整数格式。
1. 整形内存查看
1)要断点的代码行12
2)执行断点命令,断点到代码行12
3)运行程序,停止在代码行12
4)执行查看整数d内存的分布的命令:x /4xb &d,4代表4个单位,b代表单位为字节,x代表显示格式为16进制(使用16进制显示方便,因为一个字节正好可以显示两个16进制的数字)
5)p /x d 查看变量d的16进制数字:0x138
可以看到,内存分布是小端序:0x38 0x01,逆序后:0x138,和我们查看到的内存是一致的。
2. 查看char*/char[]内存结构
通过上图可以看出,先求char*/char[]的长度,然后再获取它们的内存结构。6db或者3db中的d代表10进制显示
2. 结构体内存查看
1)待查看结构体变量
2)断点到结构体变量初始化之后
3)运行
4)查看结构体变量总共内存大小
5)查看结构体变量内存分布:x /20b &tc,三部分分别是命令x, 查看长度20个字节,待查看变量的地址&tc
6)结构体变量的第一部分char name[12],他后面的97对应的字段是gener,33对应的的是age,通过这个可以看到各个字段之间的对齐关系