[英]gdb cannot access memory at value-type variable
當試圖調試由seg-fault拋出的核心時,它崩潰的線在我眼中並沒有意義; 比較了兩個整數,結果存儲在bool中。 這是不簡化的代碼:
bool doLog = level >= debugLevel;
這是它崩潰的匯編代碼:
cmp %ebx,0x14(%rbp)
// ebx = 3
// rbp = 0x6e696c7265
但是,當試圖打印存儲在rbp中的地址的值時,我得到一個gdb錯誤:“無法訪問地址0x6e696c7279處的內存”
讓我感到困惑的是,當打印debugLevel的地址時,我將獲得一個不同的地址,然后存儲在用於cmp的rbp寄存器中:
p &debugLevel => 0x6e696c7279
i r rbp => 0x6e696c7265
0x6e696c7265
看起來像字母的ASCII碼 。 你可能用字符串字節覆蓋了一個指針。
(例如,可能是緩沖區溢出踩到保存的RBP值,然后函數在恢復RBP后返回其調用者,當調用者嘗試使用RBP作為幀指針時,斷開對本地的訪問。實際上, RBP+14
不會是一個幀指針,除非這可能是在Windows上,並且編譯器在返回地址上方的陰影空間中分配了本地。)
打印debugLevel的地址我會得到一個不同的地址,然后存儲在用於cmp的rbp寄存器中
GDB從調試信息中知道&debugLevel
= RBP + 0x14。
這就是為什么cmp
指令使用位移為0x14
的尋址模式,特別是0x14(%rbp)
。 所以從損壞的基地址計算&debugLevel
會給你另一個壞地址。
0x6e696c7279 - 0x6e696c7265 = 0x14 = 20
。 這部分沒有意思或與你的內存破壞錯誤有關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.