可以在开发过程中使用以下配置来调试用户模式驱动程序框架(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 (模块加载中断)
如果进行了任何注册表更改,请重新启动。
根据你在前面的步骤中所做的选择,远程内核调试器会在驱动程序加载或卸载目标时中断。