-1

在将几 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)

任何帮助将不胜感激!

4

1 回答 1

-1

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

于 2015-01-25T22:04:33.467 回答