排查 UMDF 2.0 驱动程序崩溃问题

从 User-Mode Driver Framework (UMDF) 版本 2 开始,可以使用 Wdfkd.dll 中实现的调试器扩展命令的子集来调试 UMDF 驱动程序。 本文介绍可用于排查 UMDF 驱动程序问题的命令。

确定 UMDF 2.0 驱动程序崩溃的原因

如果驱动程序主机进程终止,则驱动程序在回调中可能会出现问题,导致超过 主机超时 阈值。 在这种情况下,反射器将终止驱动程序主机进程。

若要进行调查,请首先按照 如何启用 UMDF 驱动程序的调试中所述设置内核模式调试会话。 强烈建议使用附加到测试系统的内核调试器对 UMDF 驱动程序进行所有开发和测试,并在 WUDFHost.exe 上启用 应用程序验证程序 (AppVerif.exe) 。 使用以下命令,附加内核调试器,然后重新启动。

AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe
  • 如果设置了 HostFailKdDebugBreak ,则当超出超时阈值时,反射器会进入内核模式调试器。 在调试器输出中,可以看到有关如何开始的几个建议,包括可以选择的链接。 例如:

    **** Problem detected in UMDF driver "WUDFOsrUsbFx2". !process 0xFFFFE0000495B080 0x1f, !devstack 0xFFFFE000032BFA10, Problem code 3 ****
    **** Dump UMDF driver image name and stack: !wdfkd.wdfumdevstack 0x000000BEBB49AE20
    **** Dump UM Irps for this stack: !wdfkd.wdfumirps 0x000000BEBB49AE20
    **** Dump UMDF trace log: !wmitrace.logdump WUDFTrace
    **** Helpful UMDF debugger extension commands: !wdfkd.wdfhelp
    **** Note that driver host process may get terminated if you go past this break, making it difficult to debug the problem!
    
  • 使用 !analyze 显示有关失败的信息,以及可以尝试的其他 UMDF 扩展命令。 此命令可帮助解决 UMDF 验证程序失败或 UMDF 未经处理的异常。 可以将它用于实时内核调试或从 %ProgramData%\Microsoft\WDF 调试用户故障转储文件。

  • 使用 !process 0 0x1f wudfhost.exe 列出所有 Wudfhost.exe 驱动程序主机进程,包括线程堆栈信息。

    还可以使用 !wdfkd.wdfumtriage 和 !wdfkd.wdfldr 显示当前绑定到 WDF 的所有驱动程序。 选择 UMDF 驱动程序的映像名称时,调试器会显示托管进程的地址。 然后,可以选择进程地址以显示特定于该进程的信息。

  • 如有必要,请使用 .process /r /p Process 将进程上下文切换到托管驱动程序的 Wudfhost 进程的上下文。 使用 .cache forcedecodeuserlmu 验证驱动程序是否托管在当前进程中。

  • 检查线程调用堆栈 (!thread Address) ,以确定驱动程序回调是否超时。查看线程的时钟周期计数。 在Windows 8.1,反射器在一分钟后超时。

  • 使用 !wdfkd.wdfdriverinfo MyDriver.dll 0x10 以详细形式显示设备树。 然后选择 !wdfdevice。 此命令显示详细的电源、电源策略和即插即用 (PnP) 状态信息。

  • 使用 !wdfkd.wdfumirps 查找挂起的 IRP。

  • 使用 !wdfkd.wdfdevicequeues 检查驱动程序队列的状态。

  • 在内核模式调试会话中,可以使用 !wmitrace.logdump WudfTrace 来显示跟踪日志。

显示 UMDF 2.0 IFR 日志

在内核模式调试会话中,可以使用 !wdfkd.wdflogdump 扩展命令显示 Windows 驱动程序框架 (WDF) 正在进行的记录器 (IFR) 日志记录(如果可用)。

查找内存转储文件

有关查找用户模式转储文件的信息 ,请参阅确定反射器终止主机进程的原因 。 有关如何设置 LogMinidumpType 注册表值以指定存储在小型转储文件中的信息类型的信息,请参阅在 UMDF 驱动程序中使用 WPP 软件跟踪