vc++記憶體管理

來源:互聯網
上載者:User

 利用VC++環境的調試和診斷功能,檢查和發現常見記憶體缺陷

理解常見的記憶體缺陷問題以及在VC++環境下的癥狀,能輔助我們減少問題的發生和及時修改問題。

從錯誤的表現形式上看, 和堆棧有關的錯誤主要分為兩大類:堆疊溢位和函數返回資訊被破壞。

(1)堆疊溢位(overflow)

此類錯誤主要有兩種情形:

1)過大的局部變數。預設情況下Windows為每個線程保留1M堆棧空間。在菜單Project->Properties->Configuration Properties -> Linker->System中可以看到Stack Reserve Size選項可以調整保留的堆棧空間大小。

2)遞迴調用層數過深。在調試過程中,呼叫堆疊(call stack)視窗中可以發現函數遞迴調用的模式。

(2)函數返回資訊被破壞

此類錯誤主要有兩種情形:

1)對局部變數的寫操作超出了範圍(上溢)。在調試過程中,函數堆棧被破壞掉的明顯標誌是無法顯示呼叫堆疊,並且錯誤發生在被調用函數即將返回的位置。

2)在調用函數和被調用函數之間如果出現了函數參數的不匹配或者調用規範的不一致。

為了檢查此類錯誤,應該在代碼編譯時間開啟/GS、/RTCs開關(在菜單Project->Properties->Configuration Properties-> C/C++->Code Generation下設定)。

另外一類錯誤是動態記憶體錯誤。典型的情況如下:

(1)記憶體寫越界。在調試版本中,如果是寫上溢,就會收到“Damage:after block...”的跟蹤訊息,如果是寫下溢出就會收到“Damage: before block...”的跟蹤訊息。

(2)刪除不合法指標。在調試版本中,刪除未初始化的指標或者非堆積指標時,會收到_CrtIsValidHeapPointer斷言錯誤。

(3)多次釋放。在調試版本中,如果多次刪除同一指標, 會收到_BLOCK_TYPE_IS_VALID斷言錯誤。要防止此類錯誤,應在delete某個指向動態記憶體的指標後立即將其置為空白。

4 利用Windows結構化異常處理機制處理髮布版本軟體的記憶體崩潰

在程式的發布階段,應盡量減少程式錯誤尤其是記憶體崩潰。如果崩潰了,應該“優雅”地退出,盡量收集程式崩潰時的運行資訊以協助程式供應商後續的調試。要捕捉記憶體非法訪問並獲知非法訪問的指令地址、寄存器內容等資訊,需要用到Windows的結構化異常處理(Structured Exception Handling,SEH)機制[6]。MiniDumpWriteDump是dbghelp.dll提供的一個 API函數(參考MSDN),用於轉儲使用者模式程式的一些資訊(比如堆棧情況等)並存為一個檔案(比如.dmp檔案),此檔案可以被微軟的調試器(VC++或者WinDBG)利用進行事後調試。使用此函數需要dbghelp.h、dbghelp.lib和dbghelp.dll(這些檔案可以在Windows
Platform SDK中找到)。

要事後根據.dmp檔案調試代碼,需要為發布版本軟體產生debug symbols (pdb)檔案(開啟編譯器/DEBUG選項)。在拿到.dmp檔案以後,用VC++開啟.dmp檔案,然後調試執行(按F5鍵)。這樣,崩潰現場就會重現。文獻[5]基於上述的方法實現了崩潰報告系統。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.