判斷驅動程式是否洩漏架構物件
本主題描述如何尋找因未釋放引用而導致的驅動程式記憶體洩漏。 它適用於 User-Mode Driver Framework (UMDF) 第 1 版和 2 版驅動程式。
UMDF 1
在 UMDF 第 1 版中,如果每次呼叫 AddRef 沒有相對應的 Release 呼叫,呼叫堆疊可能會導致記憶體洩漏。
若要測試您的 UMDF 第 1 版驅動程式是否洩漏架構物件,請使用下列步驟:
使用 WDF 驗證器控制程式應用程式 來設定您想要的驗證器選項。 在一般測試期間,請從設定 TrackObjects,而不是 TrackRefCounts開始。
卸除驅動程式時,架構的程式代碼驗證器會在未刪除架構物件時輸入調試程式,並提示您使用 !wudfdumpobjects 調試程序擴充功能。 這個調試程式延伸模組會顯示未刪除的物件清單。
如果程式代碼驗證器指出驅動程式正在外泄架構物件,請使用控件應用程式來設定 TrackRefCounts 選項。
如果已設定此選項,驗證程式會在驅動程式執行時追蹤架構對象的參考。 您可以使用 !wudfrefhist 調試程式延伸模組來顯示遞增或遞減物件參考計數的每個呼叫堆疊(函數調用集)。 藉由檢查這些呼叫堆疊中的 AddRef 和 Release 呼叫,您應該能夠找到不會遞減對象的參考計數,因而造成洩漏的堆疊。
如需其他驗證程式選項的詳細資訊,請參閱 使用 UMDF 驗證程式。
如需何時刪除架構物件的資訊,請參閱 管理物件的存留期。
UMDF 2
在 UMDF 第 2 版中,未釋放的引用很少見,但可能會因為使用 WdfObjectReference 和 WdfObjectDereference時呼叫不匹配而發生。
若要測試您的 UMDF 第 2 版驅動程式是否外洩架構物件,請使用下列程式:
請遵循 最佳做法 中所述的步驟來設定您的計算機進行 UMDF 偵錯。
若要使用標籤追蹤,請同時啟用 UMDF 驗證器和處理登錄中的追蹤。 這兩個設定都會儲存在驅動程式的 Parameters\Wdf 子項的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\<驅動程式名稱> 機碼中。
若要啟用 UMDF 驗證器,請為 VerifierOn 設定非零值。
若要啟用句柄追蹤,請將 TrackHandles 的值設定為一或多個物件類型的名稱,或指定星號 ≦ 來追蹤所有物件類型。
您也可以使用 WdfVerifier.exe 應用程式來修改 UMDF 驗證器設定。
重新啟動、建立調試程式連線,然後使用下列調試程式命令:
- !wdfkd.wdfdriverinfo 0x10 以顯示句柄層級
- !wdfkd.wdftagtracker 以顯示標記資訊
如果UMDF驗證器已開啟,則會在驅動程式卸載時偵測到記憶體流失,就像在 KMDF 中一樣。
如需在 KMDF 和 UMDF 第 2 版驅動程式中使用參考計數的詳細資訊,請參閱 Framework 物件生命週期。