与实际内存内容相比,GDB 内存检查输出偏差 8 个字节

GDB memory examination output off by 8 bytes compared to actual memory content

本文关键字:内存 输出 检查 字节 GDB      更新时间:2023-10-16

当将内存转储到复杂的C++对象中时,我从 GDB 的 x 命令获得的内存转储输出之间存在奇怪的不一致。在 GDB 提示符下,我得到:

(gdb) x/32b 0x7FFFCD82B000
0x7fffcd82b000: 0xf8    0x23    0xae    0xf2    0xff    0x7f    0x00    0x00
0x7fffcd82b008: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffcd82b010: 0xff    0xff    0xff    0xff    0x00    0x00    0x00    0x00
0x7fffcd82b018: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00

这对应于对象成员的异常值,例如值不是 0 或 1 的布尔值。但是,当从/proc/pid/mem 转储此内存区域的内容时,我在前 8 个字节中得到 0,然后得到与上面相同的内存内容(左列是十进制的内存偏移量):

 0  0
 1  0
 2  0
 3  0
 4  0
 5  0
 6  0
 7  0
 8 f8
 9 23
10 ae
11 f2
12 ff
13 7f
14  0
15  0
16  0
17  0
18  0
19  0
20  0
21  0
22  0
23  0
24 30
25 21
26 4c
27 f4
28 ff
29 7f
30  0
31  0

我在Linux 3.13(Ubuntu 14.04)上使用GDB 7.7.1。我的代码是 C++ 11,我使用系统附带的 g++ 4.8.2 进行编译。

我用来转储/proc/.../mem 内容的 Python 脚本如上所示:

fp = open('/proc/24821/mem', 'r')
fp.seek(0x7fffed82b000)
r = fp.read(32)
for n, c in enumerate(r): print '%2d' % n, '%2x' % ord(c)

任何帮助将不胜感激!

找到导致这种奇怪行为的原因:使用 -fsanitize=address 选项到 g++。我没有看到任何关于此的GDB错误报告,所以猜这是我的责任:-)感谢谁考虑了我的问题!