我只是花了一些時間去追逐一個可以歸結爲以下內容的錯誤。代碼錯誤地覆蓋了堆棧,我認爲它寫了函數調用的返回地址。返回後,程序會崩潰,堆棧將被損壞。在Valgrind的運行程序都將返回一個錯誤,如:如何用Valgrind調試堆棧覆蓋錯誤?
vex x86->IR: unhandled instruction bytes: 0xEA 0x3 0x0 0x0
==9222== valgrind: Unrecognised instruction at address 0x4e925a8.
我想,這是因爲返回躍升到一個隨機位置,包含的東西,是不是有效的操作碼86。 (雖然我在某種程度上懷疑這個地址0x4e925a8碰巧在一個可執行頁面中,我想如果情況並非如此,valgrind會拋出一個不同的錯誤。)
我確定問題出在堆棧 - 覆蓋類型,我已經修復它。現在我正在想如何更有效地捕捉這樣的錯誤。顯然,valgrind無法警告我是否在堆棧上重寫了數據,但是當某人寫入堆棧上的返回地址時,它可能會被捕獲。原則上,它可以檢測何時發生類似「推送EIP」的事件(因此它可以標記返回地址在堆棧中的位置)。
我想知道如果有人知道Valgrind或其他什麼可以做到嗎?如果沒有,你能評論其他有關調試這種錯誤類型的建議嗎?
我建議你向valgrind提交一個願望清單bug。 – 2011-04-28 06:03:52
返回地址不是用'push'指令推送的,而是由'call'指令隱式的。這使得它更容易檢測到它的位置。 – 2011-04-28 06:12:50
@Jan Hudec,這將是Valgrind的一個整潔的功能,不是嗎?是的,你說的是'call'推送回信地址是正確的,我這樣寫就是爲了完全清楚。 – Max 2011-04-28 18:58:28