确定驱动程序是否泄漏框架对象

本主题介绍如何查找未发布的引用导致的驱动程序内存泄漏。 它适用于 User-Mode Driver Framework (UMDF) 版本 1 和 2 驱动程序。

UMDF 1

在 UMDF 版本 1 中,如果对 AddRef 的每次调用都没有匹配的 Release 调用,调用堆栈可能会导致内存泄漏。

若要测试 UMDF 版本 1 驱动程序是否泄漏框架对象,请使用以下步骤:

  1. 使用 WDF 验证程序控制应用程序 设置所需的验证程序选项。 在常规测试期间,首先设置 TrackObjects 而不是 TrackRefCounts

    卸载驱动程序时,如果未删除框架对象,框架的代码验证程序将进入调试器,并提示你使用 !wudfdumpobjects 调试器扩展。 此调试器扩展显示未删除的对象的列表。

  2. 如果代码验证程序指示驱动程序正在泄漏框架对象,则使用控制应用程序设置 TrackRefCounts 选项。

    如果设置了此选项,验证程序将在驱动程序运行时跟踪对框架对象的引用。 可以使用 !wudfrefhist 调试器扩展来显示每个调用堆栈 (一组函数调用) 递增或递减对象的引用计数。 通过检查这些调用堆栈中的 AddRefRelease 调用,应该能够找到不会减少对象的引用计数,从而导致泄漏的堆栈。

有关其他验证程序选项的信息,请参阅 使用 UMDF 验证程序

有关何时删除框架对象的信息,请参阅 管理对象的生存期

UMDF 2

在 UMDF 版本 2 中,未发布的引用很少见,但在使用 WdfObjectReference 和 WdfObjectDereference,可能会由于调用不匹配而发生。

若要测试 UMDF 版本 2 驱动程序是否泄漏框架对象,请使用以下过程:

  1. 按照 最佳做法 中所述的步骤配置计算机进行 UMDF 调试。

  2. 若要使用标记跟踪,请在注册表中同时启用 UMDF 验证器和句柄跟踪。 这两个设置都存储在驱动程序的 Parameters\Wdf 子项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\<驱动程序名称> 键中。

    若要启用 UMDF 验证程序,请为 VerifierOn 设置非零值。

    若要启用句柄跟踪,请将 TrackHandles 的值设置为一个或多个对象类型的名称,或指定星号 (*) 来跟踪所有对象类型。

    还可以使用 WdfVerifier.exe 应用程序修改 UMDF 验证程序设置。

  3. 重新启动,建立调试器连接,然后使用以下调试器命令:

如果 UMDF 验证程序处于打开状态,则会在驱动程序卸载时检测到内存泄漏,就像在 KMDF 中一样。

有关在 KMDF 和 UMDF 版本 2 驱动程序中使用引用计数的其他信息,请参阅 框架对象生命周期