分析已停止的驱动程序和超时
调试 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 微型端口很可能正在等待映射寄存器。