开始调试后,在Send command to GDB框里输入GDB指令
1、获得a在内存中的地址
print /x &a
2、查看内存中的值
可以看到a在内存中的地址为0x62fe1c
输入指令x /32db 0x62fe1c
查看a在内存中的值。
x /32db 0x62fe1c
表示以地址0x62fe1c为起始地址,返回32个单元的值,输出格式为有符号十进制整数,每个单元有1个字节。
可看到内存0x62fe1c处存储的值为10
分析:
第一行地址为0x62fe1c,第二行地址为0x62fe24
0x62fe24-0x62fe1c=0x000008,算出一行数据共8个字节,
可看到每行刚好有8个数,说明每个数是一个字节
a是int类型,故a应该占4个字节的位置,从图中看出低字节在前面,说明是小端存储,真正的顺序应该是0 0 0 10(十进制)
第一行有-96这样的数,故猜测此处显示的十进制数是将1字节数据当作有符号整数转换为十进制得到的
3、验证分析:
令int a=-2,a的补码是1111 1111 1111 1111 1111 1111 1111 1110
十六进制:0xfffffffe,小端存储:fe ff ff ff
小端存储(十进制,有符号):-2 -1 -1 -1
从图中可看到,试验结果与我们的推导相符合,验证成功
4、16进制显示
一般使用16进制显示内存中的值,
可将命令改为x /32xb 0x62fe1c
,表示以地址0x62fe1c为起始地址,返回32个单元的值,输出格式为按十六进制格式显示无符号整型,每个单元有1个字节。
5、详细指令
GDB命令 x
功能:查看内存地址中的值
格式:x/<n/f/u> <addr>
解释:以addr为起始地址,返回n个单元的值,输出格式是f,每个单元大小为u个字节。
--------------------------------------------------------------
例:32bu第一位是32,第二位是b,第三位是u
指令 x /32bu 0x62fe1c 标红加粗部分的格式:
第1位(返回几个单元的值) | 第2位(显示格式) | 第3位(每个单元由几个字节组成) | |||
空 | 返回1个单元的值 | 空 | 默认为有符号十进制整数 | 空 | 默认为4 Bytes |
3 | 返回3个单元的值 | x | 按十六进制格式显示变量。 | b | 1 Byte |
32 | 返回32个单元的值 | d | 按有符号十进制格式显示变量。 | h | 2 Bytes |
n | 返回n个单元的值 | u | 按十六进制格式显示无符号整型。 | w | 4 Bytes |
| | o | 按八进制格式显示变量。 | g | 8 Bytes |
| | t | 按二进制格式显示变量。 | | |
| | a | 按十六进制格式显示变量。 | | |
| | c | 按字符格式显示变量。 | | |
| | f | 按浮点数格式显示变量。 | | |
6、指令的缺省使用
建议不要省略,该写啥写啥。
虽然有默认输出格式,但使用其他格式(如十六进制)后,缺省的默认输出格式就会变为刚才使用的(十六进制)
默认格式:x / 0x62fe1c
,表示以地址0x62fe1c为起始地址,返回1个单元的值,输出格式为有符号十进制整数,每个单元有4个字节。
6.1 实验发现第三位可省略,一个单元默认是4个字节
6.2 实验发现第一位可省略,默认输出一个单元
6.3 实验发现第二位可省略,默认输出十进制整数
参考:
GDB官方文档:https://www.sourceware.org/gdb/documentation/