相关文章推荐
逃跑的键盘  ·  编译器 - ...·  1 年前    · 
坚强的柿子  ·  Django models - 掘金·  1 年前    · 

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)断点到结构体变量初始化之后

4)查看结构体变量总共内存大小

5)查看结构体变量内存分布: x  /20b  &tc,三部分分别是命令x, 查看长度20个字节,待查看变量的地址&tc

6)结构体变量的第一部分char name[12],他后面的97对应的字段是gener,33对应的的是age,通过这个可以看到各个字段之间的对齐关系