确定应用程序请求未完成的原因

可执行以下步骤来确定应用程序请求无法完成的原因:

  1. 使用 !wudfext.umirps UMDF 调试器扩展以显示主机进程中所有未完成的用户模式 I/O 请求包 (IRP)。有关每个用户模式 IRP 的信息包含创建用户模式 IRP 所针对的原始内核模式 IRP。

    确定与应用程序发起的内核模式 IRP 相对应的用户模式 IRP。

  2. 使用 !wudfext.umirp UMDF 调试器扩展以获取有关特定用户模式 IRP 的信息,如以下示例中所示:

    !wudfext.umirp <irp_addr>

    有关用户模式 IRP 的信息包括堆栈位置。如果您知道堆栈位置,则可以确定正在处理 IRP 的位置。堆栈位置 0 表示位于 UMDF 之下的堆栈(即,内核模式堆栈或某些其他子系统,如 Microsoft Win32 或 Winsock)。

  3. 如果 IPR 位于驱动程序层(即,驱动程序处理 IRP 的层),则执行以下步骤:
    1. 查看在驱动程序层建立的 I/O 队列。可使用 !wudfext.wudfdevicequeues UMDF 调试器扩展以查看在驱动程序层建立的所有 I/O 队列。也可以使用 !wudfext.wudfqueue UMDF 调试器扩展以获取有关特定队列的信息,如以下示例中所示:

      !wudfext.wudfqueue <IWDFIoQueue*>

    2. 如果有多个请求未完成,则可以使用 !wudfext.wudfrequest UMDF 调试器扩展以获取有关某个请求的信息(包括底层用户模式 IRP)。从用户模式 IRP 信息中,可确定您感兴趣的请求。
    3. 验证请求是由队列所有还是由驱动程序所有。此信息将作为 !wudfext.wudfqueue UMDF 调试器扩展的输出的一部分显示。根据请求是由队列所有还是由驱动程序所有,执行以下验证之一:
      • 如果请求是由队列所有,则检查队列的状态以确定队列没有将请求传递到驱动程序的原因。
      • 如果请求由驱动程序所有,则检查主机进程中的线程以确定在处理请求时是否有某个线程出现阻塞或死锁。
  4. 如果 IRP 位于另一个 UMDF 驱动程序层上,则可以对该层重复前面的步骤。记住,!wudfext.umdevstack UMDF 调试器扩展将显示有关所有堆栈层的信息。

  5. 如果 IRP 超过 UMDF 堆栈(例如,如果堆栈位置 0 是当前正在处理 IRP 的位置),则确定相应的内核模式 IRP 无法完成的原因。

 

 

社区附加资源

添加
显示:
© 2015 Microsoft