【问题标题】:GDB memory examination output off by 8 bytes compared to actual memory content与实际内存内容相比,GDB 内存检查输出减少了 8 个字节
【发布时间】: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 在堆上分配的,而不是在堆栈上分配的

标签: c++ linux c++11 gdb g++4.8


【解决方案1】:

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

【讨论】:

  • 你的回答没有解释任何事情,很可能是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2022-01-12
  • 2012-06-02
相关资源
最近更新 更多