通過Windbg查詢棧溢位的方法之一

2021-05-27 09:41:37 字數 728 閱讀 6542

在閱讀《windows高階除錯》時看到此方法,自己作下筆記,以免忘記。

1、在乙個程式或者產品出錯後,使用windbg進行程序附加。

2、檢視當前程式執行到何處,即eip的值,通過命令lm a eip 檢視當前程式執行到什麼模組了,若是正常的,下面eip=7c875f53,一般會像下面一樣顯示(最後一部分是符號檔案):

lm a eip

start    end        module name

7c800000 7c91e000   kernel32   (pdb symbols)          d:\sym\kernel32.pdb\072ff0eb54d24dfaae9d13885486ee092\kernel32.pdb

lm a 123456

start    end        module name

因為我的機器在這個位址上沒有載入任何模組,所以顯示為空。

3、知道了eip現在執行到何處,現在也可以看看eip的內容,通過dd或db類的命令進行檢視。

4、檢視當前棧的情況,可以使用dd esp,可以看到是一些亂七八糟的資料,對個些資料最主要的是看最近幾次的正確的返回位址,由此確認在那個呼叫後出現的棧溢位,不過我倒覺得用dd esp沒有dds esp方面,大家試試就知道了。

5、找到棧出現問題的地方後,就可以通過**定位到具體的程式中了,

這是我看完這本書第5章《記憶體破壞之一--棧》一周後,憑記憶寫的,中間可能有些東西記得不太完整了。

通過記憶體溢位理解棧的概念

棧是一種有限儲存的資料結構 資料只能在棧的頂端進行新增或刪除,遵循lifo 後進先出 原則。棧支援兩種操作push和pop。push 在棧頂新增乙個資料。pop 從棧頂移除乙個資料。接下來我們看一下一段c程式的記憶體結構在函式呼叫和返回時內容是如何變化的。text 包含將要執行的 data 包含程式...

windbg中的棧資訊

msdn參考 我們知道用kp可以檢視所有引數,用kb可以檢視前三個引數。那這裡的前三個引數,是代表參數列的前三個,而不是壓棧順序的前三個。ans foo 1,2,3,4,5 childebp retaddr args to child 0013ff34 004011df 00000001 00000...

棧的概念以及棧溢位

對每個程式來說,棧能使用的記憶體是有限的,一般是 1m 8m,這在編譯時就已經決定了,程式執行期間不能再改變。如果程式使用的棧記憶體超出最大值,就會發生棧溢位 stack overflow 錯誤。乙個程式可以包含多個執行緒,每個執行緒都有自己的棧,嚴格來說,棧的最大值是針對執行緒來說的,而不是針對程...