排查 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 forcedecodeuser 和 lmu 验证驱动程序是否托管在当前进程中。
检查线程调用堆栈 (!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 软件跟踪。