在将几 KB 的内存转储到复杂的 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)
任何帮助将不胜感激!