【问题标题】:LLDB memory read failed for 0x0. Is this a bug?0x0 的 LLDB 内存读取失败。这是一个错误吗?
【发布时间】:2021-12-27 04:05:07
【问题描述】:

在我的 LLDB 会话中,memory read 0x00000003 引发错误消息。

恕我直言,error: memory read failed for 0x0 的消息应该以 0x3 结尾。

如果这不是错误而是预期行为,谁能解释偏移/修剪的来源?

更多细节:x86_64

【问题讨论】:

    标签: debugging lldb


    【解决方案1】:

    你没有说你在什么系统上,但是 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 开始读取,但我猜这仍然会失败。

    【讨论】:

      【解决方案2】:

      内存地址将被取整(向下取整)到最接近的 256 倍数 (0x100)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-07
        • 2014-12-06
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        相关资源
        最近更新 更多