与实际内存内容相比,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 个字节的主要内容,如果未能解决你的问题,请参考以下文章

检查内存时gdb如何显示十六进制和ASCII?

检查 gdb 中的 C/C++ 堆内存统计信息

无法在 gdb 中找到更改的内存内容

GDB IA32 看到内存地址有啥?

如何使用 GDB 修改内存内容?

gdb 中的奇怪结果