在閱讀《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 錯誤。乙個程式可以包含多個執行緒,每個執行緒都有自己的棧,嚴格來說,棧的最大值是針對執行緒來說的,而不是針對程...