偵錯堆積上的區塊類型
更新:2007 年 11 月
這個主題適用於:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express 版 |
僅適用原生 |
|||
Standard 版 |
僅適用原生 |
|||
Pro/Team 版 |
僅適用原生 |
表格圖例:
套用 |
|
不套用 |
|
預設隱藏的命令。 |
偵錯堆積裡的每個記憶體區塊會設定成五種配置類型的其中一種。這些類型可以針對不同的遺漏偵測和狀態報告目的來追蹤和報告。您可以使用直接呼叫其中一個偵錯堆積配置函式,例如 _malloc_dbg,來指定區塊類型。五種偵錯堆積 (於 _CrtMemBlockHeader 結構的 nBlockUse 成員設定) 裡的記憶體區塊類型如下:
_NORMAL_BLOCK
呼叫 malloc 或 Calloc 建立一般區塊。如果您只要使用一般區塊,而且不需要用戶端區塊,您可能要定義 _CRTDBG_MAP_ALLOC,它會造成所有堆積配置呼叫都對應至它們在偵錯組建裡的偵錯對等用法。這可將每個配置呼叫的相關檔名和行號資訊儲存在對應的區塊標頭裡。_CRT_BLOCK
由許多執行階段程式庫函式內部所配置的記憶體區塊標記為 CRT 區塊,以便分別處理。因此,遺漏偵測和其他操作不會受到影響。配置必須從未配置、重新配置或釋放任何 CRT 類型的區塊。_CLIENT_BLOCK
應用程式可以使用這種記憶體區塊類型配置、使用偵錯堆積函式的明確呼叫,繼續追蹤指定的配置群組,以達到偵錯的目的。例如,MFC 將所有的 CObjects 配置為用戶端區塊;其他應用程式可能會將不同的記憶體物件保持在用戶端區塊中。也可以為達更細微的追蹤而設定用戶端區塊的子類型。若要指定用戶端區塊的子類型,將數字向左移位 (Left Shift) 16 個位元並且以 _CLIENT_BLOCK 將之 OR 起來。例如:#define MYSUBTYPE 4 freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));
可以使用 _CrtSetDumpClient 安裝用戶端提供的攔截函式 (可用來傾印儲存在用戶端區塊的物件),每當偵錯函式傾印用戶端區塊時就會被呼叫。此外,可使用 _CrtDoForAllClientObjects,來呼叫應用程式為偵錯堆積裡的每個用戶端區塊所提供的指定函式。
_FREE_BLOCK
一般來說,此清單會移除釋放的區塊。若要檢查釋放記憶體是否仍然不能寫入,或模擬低記憶體條件,您可以選擇保留連結串列上的釋放區塊,將其標記為可用,並填入已知位元組值 (目前是 0xDD)。_IGNORE_BLOCK
可以在某段時間關閉偵錯堆積操作。在這段期間,記憶體區塊會保留於清單終上,但是標記為忽略區塊。
若要判斷指定區塊的類型和子類型,請使用 _CrtReportBlockType 函式、_BLOCK_TYPE 和 _BLOCK_SUBTYPE 巨集。巨集會定義 (在 crtdbg.h 裡),參見下例:
#define _BLOCK_TYPE(block) (block & 0xFFFF)
#define _BLOCK_SUBTYPE(block) (block >> 16 & 0xFFFF)