【Tools】WinDbg--gflags除錯工具使用方法
什麼是 Page Heap (頁堆)?
從 Windows 2000 開始作業系統開始在堆管理器引入“校驗層”,即 Page Heap 管理器。這個校驗層處於 Ntdll.dll模組內。可以驗證應用程式所有的動態記憶體操作(讀寫、分配、釋放及其它操作)。
頁堆有兩種型別:正常頁堆和完全頁堆( Full Page Heap )
完全頁堆:
當分配一塊記憶體時,通過調整記憶體塊的分配位置,使其結尾恰好與系統分頁邊界對齊,然後在邊界處再多分配一個不可訪問的頁作為保護區域。這樣,一旦出現記憶體讀 / 寫越界時,程序就會 Crash ,從而幫助及時檢查記憶體越界。
因為每次分配的記憶體都要以這種形式佈局,尤其對於小片的記憶體分配,即使分配一個位元組,也要分配一個記憶體頁,和一個保留的虛擬記憶體頁(注意在目前的實現中,這個用作邊界保護區域的頁從來不會被提交)。這就需要大量的記憶體,到底一個程序需要多少記憶體,很難估算,因此在使用 Page Heap 前,至少保證你的機器至少設定了 1G 虛擬記憶體以上。
正常頁堆:
正常頁堆原理與 CRT 除錯記憶體分配函式類似,通過分配少量的填充資訊,在釋放記憶體塊時檢查填充區域。來檢測記憶體是否被損壞,此方法的優點是極大的減少了記憶體耗用量。缺點是隻能在釋放塊時檢測,不太好跟蹤出錯的程式碼位置。
Page Heap 選項位於登錄檔目錄: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows
NT/CurrentVersion/Image File Execution Options/ 你的可執行程式名 / 。當 Windows 開始啟動一個程序時, Window 通過檢查這個登錄檔目錄的設定,對該程序應用相應的 PageHeap