为何GDB查看内存结果会因是否预先查看字符串而存在差异?
GDB 查看内存地址返回结果不一致问题解答
两个返回结果均准确,差异来自GDB x(examine)命令的默认参数记忆特性:
- GDB的
x命令支持自定义读取长度、单位、显示格式,若未显式指定参数,会复用最近一次执行x命令时的配置。 - 初始状态下x86_64环境的GDB默认
x命令读取单位为4字节(word),因此首次直接执行x/x 0x401110会读取该地址起始的4个连续字节,按x86小端序拼接后返回0x000001b8。 - 若先执行
x/s 0x404028查看字符串,x/s为了按字符遍历会隐式将读取单位设置为1字节(byte),后续再执行x/x 0x401110时就只会读取该地址的首个字节,返回0xb8,这个值正好是4字节结果0x000001b8的最低有效字节,和你观察到的偏移地址结果等于原结果右移1字节的规律完全吻合。
内存地址本身的最小寻址单位就是1字节,0x401110本身指向的是1字节的存储单元,不存在“实际对应4字节还是单字节”的说法,你可以根据需求读取该地址起始任意长度的内容。
要彻底避免该类问题,每次执行x命令时显式指定读取单位即可:
- 单字节十六进制读取:
x/xb 0x401110 - 2字节十六进制读取:
x/xh 0x401110 - 4字节十六进制读取:
x/xw 0x401110 - 8字节十六进制读取:
x/xg 0x401110
内容的提问来源于stack exchange,提问作者Isomane
相关产品推荐
相关产品推荐

