分析已停止的驱动程序和超时

调试 SCSI 微型端口驱动程序时,挂起和超时的三个最常见原因是:

  • SCSI 微型端口 DPC 未运行

  • SCSI 微型端口无法请求下一个请求

  • SCSI 微型端口未完成请求,通常是因为正在等待映射寄存器。

如果怀疑 SCSI 微型端口 DPC 未运行,请使用 !pcr 显示当前处理器的 DPC 队列。 如果 SCSI 端口 DPC 例程位于 DPC 队列中,请将一个断点置于此例程上,以确定是否调用过此例程。 否则,在每个设备上使用 !scsikd.scsiext。 请考虑 !scsikd.scsiext 扩展的以下示例输出:

0: kd> !scsikd.scsiext 86353040 
Common Extension:
   < ..omitted.. >
Logical Unit Extension:
  Address (3, 0, 1, 0) Claimed  Enumerated Visible
  LuFlags (0x00000000):
  Retry 0x00          Key 0x008889ff
  Lock 0x00000000  Pause 0x00000000   CurrentLock: 0x00000000
  HwLuExt 0x862e6f00  Adapter 0x8633db28  Timeout 0x0000000a
  NextLun 0x00000000  ReadyLun 0x00000000
  Pending 0x00000000  Busy 0x00000000     Untagged 0x00000000
 
  . . .  
 
Request list @0x86353200:
      Tick count is 2526
      SrbData 8615d700  Srb 8611f4fc  Irp 8611f2b8   Key 60197  <1s
      SrbData 85e72868  Srb 86100c3c Irp 861009f8   Key e29dc7  <1s 

如果超时槽为 -1 且未标记的槽为非零,或者超时槽为非零且显示有请求,则微型端口无法请求下一个请求。

或者,如果重试槽和繁忙槽为非零,则 SCSI 微型端口可能会因为等待映射寄存器而无法完成请求。 同样,如果未标记的和挂起的槽都是非零的,则 SCSI 微型端口可能正在等待映射寄存器。 在任一情况下,SCSI 请求块 (SRB) 的地址是繁忙槽中的地址,以及未完成请求的地址。 有关 SRB 的详细信息,请使用带有此地址的 !minipkd.srb 扩展作为输入。

!devobj 扩展确定 SCSI 微型端口是否正在等待映射寄存器。 使用发出请求的设备的设备对象地址作为 !devobj 的输入。 如果当前 IRQ 为非零,则 SCSI 微型端口很可能正在等待映射寄存器。