与实际内存内容相比,GDB 内存检查输出偏差 8 个字节
GDB memory examination output off by 8 bytes compared to actual memory content
当将内存转储到复杂的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)
任何帮助将不胜感激!
找到导致这种奇怪行为的原因:使用 -fsanitize=address 选项到 g++。我没有看到任何关于此的GDB错误报告,所以猜这是我的责任:-)感谢谁考虑了我的问题!
相关文章:
- 在将数字随机生成为数组期间从内存输出随机数的数组
- C++具有模板成员变量的类. 和参数内存输出
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 为什么cout输出内存地址不是字符串?
- C++可以输出一个结构的内存地址吗
- 提升进程间共享内存删除、权限和输出文件
- 为什么 du -sh 输出错误大小的内存映射文件
- 如果关闭娱乐后()所有内存都会被交易,则如何打印输出
- 获取“将返回值分配给新变量”的警告和输出是内存地址
- 插入std :: basic_ostream实例化输出时的内存故障
- 了解Microsoft的内存泄漏检测输出
- 更新:正在输出内存位置,而不是所需的字符串
- Valgrind 在主机名命令输出中显示内存泄漏
- 怪异的结果从NVPROF输出计算内存带宽
- 从数组中删除未使用的内存,以免输出随机数
- 对数组,乱码输出(未分配的内存?
- std::dec仍然将内存地址输出为十六进制
- 与实际内存内容相比,GDB 内存检查输出偏差 8 个字节
- 是否可以从C++释放分配的内存输出