确定驱动程序是否泄漏框架对象
本主题介绍如何查找未发布的引用导致的驱动程序内存泄漏。 它适用于 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 驱动程序中使用引用计数的其他信息,请参阅 框架对象生命周期。