【发布时间】:2021-12-27 04:05:07
【问题描述】:
在我的 LLDB 会话中,memory read 0x00000003 引发错误消息。
恕我直言,error: memory read failed for 0x0 的消息应该以 0x3 结尾。
如果这不是错误而是预期行为,谁能解释偏移/修剪的来源?
更多细节:x86_64
【问题讨论】:
在我的 LLDB 会话中,memory read 0x00000003 引发错误消息。
恕我直言,error: memory read failed for 0x0 的消息应该以 0x3 结尾。
如果这不是错误而是预期行为,谁能解释偏移/修剪的来源?
更多细节:x86_64
【问题讨论】:
你没有说你在什么系统上,但是 64 位系统取消映射内存的第一个 32 位页面是很常见的。最初这样做是为了捕获 32 位 -> 64 位转换错误。 32 位代码中的一个常见错误是将指针作为 32 位整数传递到某处,这在 64 位世界中会将其截断为 32 位。使
映射 0x0 处的页面以立即捕获对 nullptr 的访问通常也很方便,因此许多系统也会映射零以上的某些页面,即使不是完整的 32 位也是如此。
所以很可能 lldb 是正确的,0x0 处的内存和上面的某个区域没有映射,我们无法读取它。
Semnodime 关于为什么访问是 0x0 是正确的。 lldb 在内部使用“内存缓存”。如果你读了一段内存,你很可能会读到它周围的一些内存,所以这会加快 lldb 的速度,尤其是在进行远程调试时。所以默认情况下 lldb 会在它实际需要的地址周围读取一些数量。
您可以根据需要控制它读取的数量,使用:
settings set target.process.memory-cache-line-size <SomeValue>
还有:
settings set target.process.disable-memory-cache true
完全关闭缓存。如果你这样做了,lldb 会尝试从 0x3 开始读取,但我猜这仍然会失败。
【讨论】:
内存地址将被取整(向下取整)到最接近的 256 倍数 (0x100)。
【讨论】: