bug 检查0x133:DPC_WATCHDOG_VIOLATION

DPC_WATCHDOG_VIOLATION bug 检查 的值为 0x00000133。 此 bug 检查指示执行 DPC 监视器,可能是因为它检测到一个长时间运行的延迟过程调用 (DPC) ,或者因为系统长时间在中断请求级别花费了 (IRQL) DISPATCH_LEVEL 或更高版本。

参数 1 的值指示单个 DPC 是否超过超时,或者系统是否累积花费了在 IRQL DISPATCH_LEVEL 或更高版本的时间。 DPC 的运行时间不应超过 100 微秒,ISR 的运行时间不应超过 25 微秒,但系统上的实际超时值设置要高得多。

有关 DPC 的详细信息,请参阅由 Pavel Yosifovich、Mark E. Russinovich、David A. Solomon 和 Alex Ionescu 撰写的 DPC 对象Windows 内部 7th 版简介第 1 部分

重要

本文面向程序员。 如果你是使用计算机时收到蓝屏错误代码的客户,请参阅 蓝屏错误疑难解答

DPC_WATCHDOG_VIOLATION参数

参数 1 指示冲突的类型。 其他参数的含义取决于 参数 1 的值。

参数 1 参数 2 参数 3 参数 4 错误消息的原因
0 DPC 时间计数 (刻度) DPC 时间分配 (刻度) 。 强制转换为 nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK,其中包含有关此单个 DPC 超时的其他信息 单个 DPC 或 ISR 超出了其时间分配。 通常可以使用堆栈跟踪来标识有问题的组件。
1 监视程序周期 强制转换为 nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK,其中包含有关此单个 DPC 超时的其他信息 保留 系统累计在 IRQL DISPATCH_LEVEL 或更高版本中花费了较长时间。 通常可以使用堆栈跟踪来标识有问题的组件。

原因

若要确定原因,需要 Windows 调试器、编程经验和对故障模块源代码的访问权限。

有关详细信息,请参阅以下主题:

使用 Windows 调试器 (WinDbg) 进行故障转储分析

使用 WinDbg 分析内核模式转储文件

使用 !analyze 扩展!analyze

有关 Windows DPC 的详细信息,请参阅由 Pavel Yosifovich、Mark E. Russinovich、David A. Solomon 和 Alex Ionescu 撰写的 Windows Internals 7th Edition 第 1 部分

示例 1

!analyze 调试扩展显示有关 bug 检查的信息,并有助于确定根本原因 。

参数 1 = 0

在此示例中,501 的时钟周期计数超过了 500 的 DPC 时间分配。 映像名称指示此代码在 bug 检查发生时正在执行。

0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DPC_WATCHDOG_VIOLATION (133)
The DPC watchdog detected a prolonged run time at an IRQL of DISPATCH_LEVEL
or above.
Arguments:
Arg1: 0000000000000000, A single DPC or ISR exceeded its time allotment. The offending
    component can usually be identified with a stack trace.
Arg2: 0000000000000501, The DPC time count (in ticks).
Arg3: 0000000000000500, The DPC time allotment (in ticks).
Arg4: 0000000000000000

...

IMAGE_NAME:  BthA2DP.sys
...

使用以下调试器命令收集参数为 0 的失败的详细信息:

k (显示堆栈回溯) 查看停止代码发生时正在运行的代码。

你可能想要使用 u、ub、uu (Unassemble) 命令来更深入地了解正在运行的代码的具体情况。

!pcr 扩展显示处理器控制区域的当前状态, (特定处理器上的 PCR) 。 在输出中为 Prcb 的地址

0: kd> !pcr
KPCR for Processor 0 at fffff8035f5a4000:
    Major 1 Minor 1
	NtTib.ExceptionList: fffff80368e77fb0
	    NtTib.StackBase: fffff80368e76000
	   NtTib.StackLimit: 0000000000000000
	 NtTib.SubSystemTib: fffff8035f5a4000
	      NtTib.Version: 000000005f5a4180
	  NtTib.UserPointer: fffff8035f5a4870
	      NtTib.SelfTib: 000000b6d3086000

	            SelfPcr: 0000000000000000
	               Prcb: fffff8035f5a4180
	               Irql: 0000000000000000
	                IRR: 0000000000000000
	                IDR: 0000000000000000
	      InterruptMode: 0000000000000000
	                IDT: 0000000000000000
	                GDT: 0000000000000000
	                TSS: 0000000000000000

	      CurrentThread: fffff80364926a00
	         NextThread: ffffe40b77c12040
	         IdleThread: fffff80364926a00

可以使用 dt (Display Type) 命令显示有关 DPC 和 DPC 监视器的其他信息。 对于地址,请使用 !pcr 输出中列出的 Prcb:

dt nt!_KPRCB fffff80309974180 Dpc* 
0: kd> dt nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK fffff803648fa320
   +0x000 Signature        : 0xaebecede
   +0x004 Revision         : 1
   +0x006 Size             : 0x10
   +0x008 DpcWatchdogProfileOffset : 0x84a8
   +0x00c DpcWatchdogProfileLength : 0x8200

示例 2

参数 1 = 1

对于参数 1,代码不能在代码的违规区域中停止。 在这种情况下,一种方法是使用事件跟踪来尝试跟踪哪个驱动程序超过其正常执行持续时间。

使用 !analyze 调试扩展显示有关 bug 检查的信息。

0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DPC_WATCHDOG_VIOLATION (133)
The DPC watchdog detected a prolonged run time at an IRQL of DISPATCH_LEVEL
or above.
Arguments:
Arg1: 0000000000000001, The system cumulatively spent an extended period of time at
	DISPATCH_LEVEL or above. The offending component can usually be
	identified with a stack trace.
Arg2: 0000000000001e00, The watchdog period.
Arg3: fffff803648fa320, cast to nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK, which contains
	additional information regarding the cumulative timeout
Arg4: 0000000000000000

强制转换 nt 的地址!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK显示有关它的信息。

0: kd> dt nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK fffff803648fa320
   +0x000 Signature        : 0xaebecede
   +0x004 Revision         : 1
   +0x006 Size             : 0x10
   +0x008 DpcWatchdogProfileOffset : 0x84a8
   +0x00c DpcWatchdogProfileLength : 0x8200

使用 !dpcs 命令显示排队的 DPC。

3: kd> !dpcs
CPU Type      KDPC       Function
 0: Normal  : 0xfffff8035f5ac290 0xfffff80363e15630 nt!PpmPerfAction
Failed to read DPC at 0xffffe40b77190dd8
 0: Threaded: 0xfffff8035f5ac3d8 0xfffff80363f27d70 nt!KiDpcWatchdog

解决方法

若要确定特定原因并创建代码修复,需要具有编程经验和对故障模块源代码的访问权限。

备注

通常,此停止代码是由在某些条件下未在分配的时间范围内完成其工作的错误驱动程序代码引起的。

如果你没有能力使用 Windows 调试器来解决此问题,则应使用一些基本的故障排除技术。

  • 如果在 bug 检查消息中发现了驱动程序,则要隔离问题,请禁用驱动程序。 请与制造商联系以获取驱动程序更新。

  • 在系统登录事件查看器中查看其他错误消息,这些错误消息可能有助于识别导致 bug 检查 0x133的设备或驱动程序。

  • 确认安装的任何新硬件都与已安装的 Windows 版本兼容。 例如,对于Windows 10,可以在 Windows 10 规范中获取有关所需硬件的信息。

  • 有关其他常规故障排除信息,请参阅 蓝屏数据

另请参阅

使用 Windows 调试器 (WinDbg) 进行故障转储分析

使用 WinDbg 分析内核模式转储文件

Bug 检查代码参考