判斷驅動程式是否外泄 Framework 物件
本主題描述如何尋找未發行參考所造成的驅動程式記憶體流失。 它適用于 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 驗證器和處理登錄中的追蹤。 這兩個設定都會儲存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\驅動程式名稱 > 索引鍵的驅動程式 Parameters\Wdf 子機碼 <中。
若要啟用 UMDF 驗證器,請為VerifierOn設定非零值。
若要啟用控制碼追蹤,請將 TrackHandles 的值設定為一或多個物件類型的名稱,或指定星號 (*) 來追蹤所有物件類型。
您也可以使用 WdfVerifier.exe 應用程式來修改 UMDF 驗證器設定。
重新開機、建立偵錯工具連線,然後使用下列偵錯工具命令:
- !wdfkd.wdfdriverinfo 0x10 以顯示控制碼階層
- !wdfkd.wdftagtracker 以顯示標記資訊
如果 UMDF 驗證器開啟,則會在驅動程式卸載時偵測到記憶體流失,就像在 KMDF 中一樣。
如需在 KMDF 和 UMDF 第 2 版驅動程式中使用參考計數的詳細資訊,請參閱 Framework 物件生命週期。