HEAP CORRUPTION DETECTED: after Normal block (#xxxxxx) at 0xxxxxxx的相關分析

一次做公司的一個項目,遇到這麼個問題:寫的DLL的工程需要被第三方EXE調用,編譯成功後運行,過一會就出現彈框提示:Debug Error! HEAP CORRUPTION DETECTED: after Normal block (#xxxxxx) at 0xxxxxxx。如下圖:

我的工程生成的是debug版本的DLL,所以運行時會彈出這個提示框,告訴我內存哪裏崩潰了。如果你生成的release版本的DLL,那麼程序直接崩潰退出,不會有這個崩潰點提示框。

看這個提示框的提示信息,只寫了崩潰的內存地址,並沒有任何與源代碼相關的提示,這就讓人很崩潰,無法直接找到問題所在,只能一步步猜,一步步debug了。萬幸的是,我看完可能會出錯的代碼後,找了這個問題所在,並把malloc的動態內存改寫成一個大空間的數組pcRevBuffer[100],重新生成後,運行,崩潰並彈框提示,如下圖:

上圖的崩潰信息包括崩潰的模塊、崩潰相關的程序代碼。

我之前malloc聲明內存空間和這次的數組空間,都是通過傳址給EXE程序來使用的,EXE程序會向裏面寫入數據,而正是EXE的寫入越界導致崩潰。不同的是,malloc開闢的內存寫越界和數組寫越界,崩潰後的提示內容不一樣。

這是因爲數組的內存空間邊界是明確的,與數組名稱是綁定的,RUN-Time很清楚這塊空間的範圍是哪裏到哪裏;而malloc的空間,是動態開闢的,只有程序自己知道內存範圍是多少,RUN-Time不清楚,它只能識別你寫溢出的數據會不會影響程序的正常運行,崩潰的地址是多少,而你程序中有哪些指針指向這塊空間就不知道了,更無法提示出這些指針名稱。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章