在我的 LLDB 會話中,memory read 0x00000003拋出錯誤訊息。
恕我直言,訊息error: memory read failed for 0x0應以0x3.
如果這不是錯誤而是預期的行為,有人可以解釋偏移/修剪的來源嗎?

更多細節:x86_64
uj5u.com熱心網友回復:
記憶體地址將被舍入(向下取整)到最接近的 256 (0x100) 倍數。
uj5u.com熱心網友回復:
如果我沒記錯的話$eax是定義為0x0,所以說memory read不能讀取里面的值0x0。
uj5u.com熱心網友回復:
你沒有說你在什么系統上,但 64 位系統取消映射記憶體的前 32 位頁面是很常見的。這樣做最初是為了捕獲 32 位 -> 64 位轉換錯誤。32 位代碼中的一個常見錯誤是將指標作為 32 位整數傳遞到某處,而在 64 位世界中,這會將其截斷為 32 位。使 < 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 開始讀取,但我猜這仍然會失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358586.html
上一篇:Java11:Object.equals()方法的奇怪行為
下一篇:除錯從不解決承諾/異步等待
