簡體   English   中英

gdb無法訪問value-type變量的內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM