错误检查 0x133:DPC_WATCHDOG_VIOLATION

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

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

有关 DPC 的详细信息,请参阅 Pavel Yosifovich、Mark E. Russinovich、David A. Solomon 和 Alex Ionescu 编写的 DPC 对象简介Windows 内部资料第 7 版第 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 超时的其他信息 Reserved 系统在 IRQL DISPATCH_LEVEL 或更高版本上累计花费了较长的时间。 通常可以使用堆栈跟踪来标识有问题的组件。

原因

要确定原因,需要 Windows 调试器、编程体验以及访问故障模块的源代码。

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

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

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

使用 !analyze 扩展!analyze

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

示例 1

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

参数 1 = 0

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

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(显示类型)命令显示有关 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 调试扩展显示有关错误检查的信息。

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 调试器来解决此问题的能力,则应使用一些基本的故障排除技术。

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

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

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

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

另请参阅

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

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

错误检查代码参考