我在将内存数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
这对应于对象成员的异常值,例如bools的值不是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)
任何帮助将不胜感激!
答案 0 :(得分:-1)
找到导致这种奇怪行为的原因:使用 -fsanitize = address 选项来g ++。我没有看到任何关于此的GDB错误报告,所以在这里猜测我的责任:-) 感谢任何考虑过我的问题的人!