Debug時,記憶體裡怎麼都是“燙燙燙燙燙燙”

來源:互聯網
上載者:User

在 Debug 模式下會自動加上 /GZ 編譯選項,它可以協助捕獲記憶體錯誤。

/GZ 選項會做以下這些事

(1) 初始化記憶體和變數。包括用 0xCC 初始化所有自動變數,0xCD ( Cleared Data ) 初始化堆中分配的記憶體(即動態分配的記憶體,例如 new ),0xDD ( Dead Data ) 填充已被釋放的堆記憶體(例如 delete ),0xFD( deFencde Data ) 初始化受保護的記憶體(debug 版在動態分配記憶體的前後加入保護記憶體以防止越界訪問),其中括弧中的詞是微軟建議的助記詞。這樣做的好處是這些值都很大,作為指標是不可能的(而且 32 位系統中指標很少是奇數值,在有些系統中奇數的指標會產生執行階段錯誤),作為數值也很少遇到,而且這些值也很容易辨認,因此這很有利於在 Debug 版中發現 Release 版才會遇到的錯誤。要特別注意的是,很多人認為編譯器會用 0 來初始設定變數,這是錯誤的(而且這樣很不利於尋找錯誤)。

(2) 通過函數指標調用函數時,會通過檢查棧指標驗證函式調用的匹配性。(防止原形不匹配)

(3) 函數返回前檢查棧指標,確認未被修改。(防止越界訪問和原形不匹配,與第二項合在一起可大致類比幀指標省略FPO)

“燙”字的MBCS編碼為“CCCC”,而用 /GZ 選項對自動變數會用“0xCC”初始化,連續的“0xCC”將被誤讀成“燙”字元。

CC是int 3h的機器碼,這是一個中斷指令.debug版本的記憶體中填充這個指令就是讓程式出現錯誤的時候(非法跳轉)能停下來.方便調試

CDCD 為“屯”字元    DDDD 為“葺”字元

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/weixing979/archive/2006/11/05/1367969.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.