集區追蹤
集區追蹤會監視驅動程式所做的記憶體配置。 在卸載驅動程式時,驅動程式驗證器可確保已釋放驅動程式所做的所有配置。
未凍結的記憶體配置 (也稱為 記憶體流失 ,) 是降低作業系統效能的常見原因。 這些可能會分散系統集區,最終導致系統當機。
當此選項處於作用中狀態時,如果驅動程式卸載而不釋放其所有配置,驅動程式會發出錯誤檢查0xC4 (,且參數 1 等於 0x62) 。
如果驅動程式驗證器發出這個錯誤檢查參數 1 等於0x51、0x52、0x53、0x54或0x59,則驅動程式已寫入其配置之外的記憶體。 在此情況下,您應該啟用 特殊集區 功能來找出錯誤的來源。
如需錯誤檢查參數的清單,請參閱 錯誤檢查0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) 。
從 Windows Vista 開始,啟用 [集區追蹤] 選項也會啟用鎖定頁面的追蹤。 當此選項處於作用中狀態時,如果驅動程式在 I/O 作業之後無法釋放鎖定的頁面,驅動程式就會發出 錯誤檢查0xCB (DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS) 。
在 Windows 7 和更新版本的 Windows 作業系統中,[集區追蹤] 選項支援使用下列核心 API 配置的記憶體:
IoAllocateIrp 和其他可配置 I/O 要求封包的常式, (IRP) 資料結構
RtlAnsiStringToUnicodeString 和其他執行時間程式庫 (RTL) 字串常式
在 Windows 7 和更新版本的 Windows 作業系統中,當啟用集區追蹤時,驅動程式驗證器可以偵測嘗試在閒置進程內容中使用 配額 配置核心集區記憶體。 這類嘗試通常表示驅動程式會從 DPC 常式配置記憶體。 DPC 常式的執行緒或進程內容不可靠,因此嘗試為該程式收取配額不正確。
監視集區追蹤
記憶體集區配置統計資料可以個別監視每個要驗證的驅動程式。 這些統計資料可由驅動程式驗證器管理員、Verifier.exe命令列或記錄檔顯示。 如需詳細資訊 ,請參閱監視個別計數器 。
核心偵錯工具擴充 功能 !verifier 0x3 可用來在卸載驅動程式之後找出未處理的記憶體配置,或在驅動程式執行時追蹤目前的配置。 此延伸模組也會針對每個配置顯示集區標籤、集區的大小,以及配置器的位址。 如需偵錯工具延伸模組的詳細資訊,請參閱 Windows 偵錯。
DPC 常式的集區配額費用
核心驅動程式可以呼叫 ExAllocatePoolWithQuotaTag 來配置核心集區記憶體,並收取配置給目前進程集區配額的位元組數目。 驅動程式通常會針對與來自應用程式的要求直接相關的記憶體配置使用配額。
延後程序呼叫 (DPC) 常式可以在任何進程的內容中執行。 因此,從 DPC 常式收取配額會收取隨機程式的費用。 更糟的是,當 DPC 常式在閒置進程的內容中執行時,此狀況可能會導致記憶體損毀或系統當機。
從 Windows 7 開始,驅動程式驗證器會偵測來自 DPC 常式的 ExAllocatePoolWithQuotaTag 呼叫。
啟用此選項
您可以使用驅動程式驗證器管理員或Verifier.exe命令列,為一或多個驅動程式啟用集區追蹤功能。 如需詳細資訊,請參閱 選取驅動程式驗證器選項。
在命令列
在命令列上,集區追蹤選項是由 位 3 (0x8) 來表示。 若要啟用集區追蹤,請使用旗標值0x8,或將0x8新增至旗標值。 例如:
verifier /flags 0x8 /driver MyDriver.sys
下一次開機之後,此功能將會處於作用中狀態。
在 Windows Vista 和更新版本的 Windows 上,您也可以將 /volatile 參數新增至 命令,以啟動和停用集區追蹤,而不需重新開機電腦。 例如:
verifier /volatile /flags 0x8 /adddriver MyDriver.sys
此設定會立即生效,但當您關閉或重新開機電腦時遺失。 如需詳細資訊,請參閱 使用變動性設定。
集區追蹤功能也會包含在標準設定中。 例如:
verifier /standard /driver MyDriver.sys
使用驅動程式驗證器管理員
- 啟動驅動程式驗證器管理員。 在 [命令提示字元] 視窗中輸入 驗證程式 。
- 選取 [為程式碼開發人員建立自訂設定] () ,然後按 [ 下一步]。
- 從完整清單中選取 [選取個別設定]。
- 選取 [ (]) [集區 追蹤]。
集區追蹤功能也會包含在標準設定中。 若要使用此功能,請在 [驅動程式驗證器管理員] 中,按一下 [ 建立標準設定]。