可以在开发过程中使用以下配置来调试用户模式驱动程序框架(UMDF)驱动程序。 所有配置都涉及两台计算机、一台主机和一个目标。
- 手动将驱动程序复制到目标。 对目标执行用户模式调试。 在此方案中,您需要手动附加到目标上运行的驱动程序主机进程的实例。
- 手动将驱动程序复制到目标,然后从主机执行内核模式调试。
建议使用附加内核调试器执行所有 UMDF 驱动程序测试和开发。
最佳做法
建议使用附加内核调试器执行所有 UMDF 驱动程序测试。
建议使用以下设置。 可以手动设置这些设置,或使用 WDK 中的 WDF 验证程序控制应用程序 (WDFVerifier.exe)工具查看或更改这些设置。
- 在 WUDFHost.exe上启用应用程序验证程序: - AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe- 如果发生异常,应用程序验证程序会将诊断消息发送到调试器并中断。 
- 如果使用内核模式调试会话,请设置 HostFailKdDebugBreak ,以便反射器在终止驱动程序主机进程之前中断内核模式调试器。 此设置默认在 Windows 8 中启用。 
- 通过将 UmdfHostProcessSharing 设置为 ProcessSharingDisabled 来禁用连接池。 有关信息,请参阅 在 INF 文件中指定 WDF 指令。 
- 默认情况下,当 UMDF 设备发生故障时,框架将尝试重启最多五次。 可以通过将 DebugModeFlags 设置为0x01来关闭自动重启。 有关详细信息,请参阅 用于调试 WDF 驱动程序的注册表值。 
- 重新启动计算机。 
- 若要调试 UMDF 驱动程序问题,请查看确定反射器终止主机进程和调试 UMDF 驱动程序崩溃的原因 
使用 WinDbg 手动附加(用户模式调试)
在目标计算机上,可以手动将 WinDbg 附加到承载驱动程序的 WUDFHost 实例。 附加时,将进入调试器,可以在驱动程序中设置断点。
由于驱动程序初始化在 WUDFHost 加载后不久发生,因此无法及时手动附加调试初始化代码。 相反,请设置注册表值,使主机进程在主机初始化或驱动程序加载时等待一些秒数。 此延迟使你有时间将 WinDbg 附加到 WUDFHost 进程的正确实例。
执行以下步骤:
- 在目标计算机上的注册表中,将 HostProcessDbgBreakOnStart 或 HostProcessDbgBreakOnDriverLoad 设置为一些秒数并重新启动。
- 在目标计算机上,以管理员身份打开 WinDbg。
- 在“ 文件 ”菜单上,选择“ 附加到进程”。 选择 By Executable,并找到所有名为 WUDFHost.exe 的进程(可能不存在)。 如果有任何名为 WUDFHost.exe的进程,请记下其进程标识符以供将来参考。
- 在设备管理器中,启用驱动程序。
- 重复步骤 2 并找到 WUDFHost.exe的新实例。 如果未看到 WUDFHost.exe的新实例,请选择“ 取消”,然后再次选择“ 附加到进程 ”。 找到 WUDFHost.exe的新实例时,请选择它,然后选择“ 确定”。
如果使用设备池化,并且设置了HostProcessDbgBreakOnDriverLoad 注册表值,则可能会看到调试器因其他驱动程序加载而触发中断。 可以使用 UMDF 调试模式关闭设备池。
若要使用调试模式,请使用 Visual Studio 中的 F5 选项,或在注册表中设置 DebugModeFlags 和 DebugModeBinaries 值。
有关 UMDF 注册表值的详细信息,请参阅用于调试 WDF 驱动程序的注册表值(KMDF 和 UMDF)。
使用 WinDbg 从主机远程调试(内核模式调试)
从远程主机建立内核模式调试会话。 然后将当前进程设置为承载驱动程序的 Wudfhost 实例。 如果要从远程内核调试器进行调试,请将 HostProcessDbgBreakOnDriverStart 或 HostProcessDbgBreakOnDriverLoad 设置为0x80000000,以指定无超时,但会中断内核调试器。
使用以下步骤:
- 禁用池。 打开 DebugModeFlags 并在 DebugModeBinaries 中列出您的驱动程序。 
- 如果驱动程序使用 UMDF 1.11 或更高版本,则默认情况下会启用 HostFailKdDebugBreak 。 跳过此步骤。 - 如果驱动程序使用 UMDF 1.9 或更早版本,请将 HostFailKdDebugBreak 设置为 1。 
- 如果要调试与超时相关的问题,请关闭 HostProcessDbgBreakOnDriverStart 和 HostProcessDbgBreakOnDriverLoad。 (当 HostProcessDbgBreakOnDriverStart 或 HostProcessDbgBreakOnDriverLoad 为非零时,框架将禁用超时,以便反射器不会在用户模式调试器附加到主机进程时终止主机。如果需要调试驱动程序初始化代码,而不是使用这两个值,请尝试在驱动程序加载之前在 WinDbg 中发出以下命令 :sxe ld:MyDriver.dll (模块加载中断) 
- 如果进行了任何注册表更改,请重新启动。 
- 根据你在前面的步骤中所做的选择,远程内核调试器会在驱动程序加载或卸载目标时中断。