与实际内存内容相比,GDB 内存检查输出减少了 8 个字节
Posted
技术标签:
【中文标题】与实际内存内容相比,GDB 内存检查输出减少了 8 个字节【英文标题】:GDB memory examination output off by 8 bytes compared to actual memory content 【发布时间】:2015-01-25 19:07:54 【问题描述】:在将几 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)
任何帮助将不胜感激!
【问题讨论】:
其余内容不一样。查看从 24 开始的字节。还有 0x7fffed82b000(在 python 中)!= 0x7FFFCD82B000(在 GBD 中) 我的猜测是,在获取局部变量的引用然后从函数返回之后,您正在查看堆栈顶部的数据。相同的 8 个字节出现在其中并且类似的地址随后存储在字节 24-31 的事实表明您正在查看堆栈帧,或者引用堆栈上的其他数据,或者带有帧指针的堆栈顶部. 感谢您注意到地址的不同。猜猜我从我的可执行文件的两次不同运行中获取了示例,但问题是真实的,请在下面查看我的答案。另请注意,该对象是通过 new 在堆上分配的,而不是在堆栈上分配的 【参考方案1】:找到导致这种奇怪行为的原因:-fsanitize=address 选项对 g++ 的使用。我没有看到任何关于此的 GDB 错误报告,所以我猜这是我的责任 :-) 感谢任何考虑我问题的人!
【讨论】:
你的回答没有解释任何事情,很可能是错误的。以上是关于与实际内存内容相比,GDB 内存检查输出减少了 8 个字节的主要内容,如果未能解决你的问题,请参考以下文章