确定反射器终止主机进程的原因
本主题介绍如何分析反射器终止驱动程序主机进程的原因(WUDFHost.exe),或驱动程序主机进程崩溃的原因。
反射器终止主机进程的最常见原因是 UMDF 主机进程超时过期。
强烈建议使用附加到测试系统的内核调试器对 UMDF 驱动程序进行所有开发和测试,并在WUDFHost.exe上启用应用程序验证程序(AppVerif.exe)。 使用以下命令,附加内核调试器,然后重新启动。
AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe
使用转储文件
当 UMDF 驱动程序崩溃或遇到问题时,内核调试器中将报告中断。 在内核调试器中报告用户模式异常时,应调试这些问题。 内核调试器中断也由WudfRd.sys报告,因为存在问题(非响应性)UMDF 驱动程序而终止驱动程序主机进程。 还可以在以下位置找到报告的日志和堆转储。 若要查看 UMDF 捕获的转储文件,请执行以下步骤:
在 %ProgramData%\Microsoft\WDF 目录中找到最新的.dmp文件。 在 Windows 10 1507 随附的 UMDF 2.15 之前,日志目录位于 %windir%\system32\LogFiles\WUDF 下。
使用以下命令将最新的.dmp文件加载到调试器中:
WinDbg -z <path to the .dmp file>
在终止时查看线程的状态。
如果需要捕获堆转储,在测试时设置以下注册表值,并在运行测试之前重新启动测试系统。 还可以检查 %SystemRoot%\System32\Winevt\Logs\Application.evtx 上系统应用程序事件日志中的Windows 错误报告历史记录
reg add "HKLM\Software\Microsoft\windows NT\CurrentVersion\Wudf" /v LogMinidumpType /t REG_DWORD /d 0x1122
reg add "HKLM\Software\Microsoft\windows NT\CurrentVersion\Wudf" /v LogEnable /t REG_DWORD /d 1
使用调试器
在其他情况下,可能需要附加到实时内核模式目标,以确定反射器终止主机进程的原因。 若要设置调试会话,请按照“如何启用 UMDF 驱动程序调试”中所述的步骤进行操作。
建立连接后,使用 !wdfkd.wdfumtriage 检查 UMDF 驱动程序,使用 !wdfkd.wdfumirps UMDF 调试器扩展(!wudfext.umirps for UMDF 版本 1)显示未完成的 IRP。
如果 PnP IRP 或电源 IRP 挂起,请通过检查主机进程中的线程来确定驱动程序导致 IRP 挂起的原因。
可以使用 !进程 扩展检查在主机进程中运行的线程。 0x1f标志值显示每个线程的堆栈跟踪。
!process process <addr> 0x1f
如果驱动程序尚未快速完成已取消的 IRP,请确定哪个 IRP 已取消,以及它未完成的原因。
如果清理或关闭 IRP 处于挂起状态,请确定 IRP 处理时间较长的原因。