确定反射器终止主机进程的原因

本主题介绍如何分析反射器终止驱动程序主机进程的原因(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 捕获的转储文件,请执行以下步骤:

  1. 在 %ProgramData%\Microsoft\WDF 目录中找到最新的.dmp文件。 在 Windows 10 1507 随附的 UMDF 2.15 之前,日志目录位于 %windir%\system32\LogFiles\WUDF 下。

  2. 使用以下命令将最新的.dmp文件加载到调试器中:

    WinDbg -z <path to the .dmp file>
    
  3. 在终止时查看线程的状态。

如果需要捕获堆转储,在测试时设置以下注册表值,并在运行测试之前重新启动测试系统。 还可以检查 %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 处理时间较长的原因。