备注

硬件认证要求

有关硬件设备在实现 TDR 时必须满足的要求的信息,请参阅 Device.Graphics...TDRRResiliency 上的 WHCK 文档。

Windows 蓝屏代码 0x116:VIDEO_TDR_FAILURE

VIDEO_TDR_FAILURE 错误检查的值为 0x00000116.
这表示尝试重置显示驱动程序并从超时中恢复失败。

VIDEO_TDR_FAILURE 参数

参数说明
1指向内部 TDR 恢复上下文的指针(如果可用)。
2指向负责设备驱动程序模块的指针(例如,所有者标签)。
3上次失败操作的错误代码(如果有)。
4内部上下文相关数据(如果可用)。
on  It Road.com

分辨率

GPU 花费比允许的更多时间将图形显示到显示器上。
出现此行为的原因

  • 可能是以下一个或者多个:我们可能需要为显示驱动程序安装最新更新,以便它正确支持 TDR 进程。
  • 影响显卡正常运行能力的硬件问题,包括:
  • 超频组件,如主板
  • 组件兼容性和设置不正确(尤其是内存配置和时序)
  • 系统冷却
  • 不足 系统电源不足
  • 有缺陷的部件(内存模块、主板等)
  • 视觉效果或者后台运行的程序过多可能会降低 PC 速度,从而导致显卡不能响应必要。

!analyze 调试扩展显示有关错误检查的信息,有助于确定根本原因。
详细步骤查看我们的教程 在windows 中使用WinDBG 调试dmp文件

1: kd> !analyze -v
***
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
***
VIDEO_TDR_FAILURE (116)
Attempt to reset the display driver and recover from timeout failed.
Arguments:
Arg1: ffffe000c2c404c0, Optional pointer to internal TDR recovery context (TDR_RECOVERY_CONTEXT).
Arg2: fffff8016470c14c, The pointer into responsible device driver module (e.g. owner tag).
Arg3: ffffffffc000009a, Optional error code (NTSTATUS) of the last failed operation.
Arg4: 0000000000000004, Optional internal context dependent data.
...

还会显示故障模块名称

MODULE_NAME: nvlddmkm
IMAGE_NAME:  nvlddmkm.sys

我们可以使用 lm(列出加载的模块)命令来显示有关故障驱动程序的信息,包括时间戳。

1: kd> lmvm nvlddmkm
Browse full module list
start             end                 module name
fffff801`63ec0000 fffff801`649a7000   nvlddmkm T (no symbols)           
    Loaded symbol image file: nvlddmkm.sys
    Image path: \SystemRoot\system32\DRIVERS\nvlddmkm.sys
    Image name: nvlddmkm.sys
    Browse all global symbols  functions  data
    Timestamp:        Wed Jan  8 15:43:44 2015 (559DA7A0)
    CheckSum:         00AA7491
    ImageSize:        00AE7000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4

参数 1 包含指向 TDR_RECOVERY_CONTEXT 的指针。
如 !analyze 输出所示,如果我们有关联代码的符号,则可以使用 dt 命令来显示此数据。

1: kd> dt dxgkrnl!_TDR_RECOVERY_CONTEXT ffffe000c2c404c0
   +0x000 Signature        : 0x52445476
   +0x008 pState           : 0xffffe000`c2b12a40 ??
   +0x010 TimeoutReason    : 9 ( TdrEngineTimeoutPromotedToAdapterReset )
   +0x018 Tick             : _ULARGE_INTEGER 0xb2
   +0x020 pAdapter         : 0xffffe000`c2a89010 DXGADAPTER
   +0x028 pVidSchContext   : (null) 
   +0x030 GPUTimeoutData   : _TDR_RECOVERY_GPU_DATA
   +0x048 CrtcTimeoutData  : _TDR_RECOVERY_CONTEXT::<unnamed-type-CrtcTimeoutData>
   +0x050 pProcessName     : (null) 
   +0x058 DbgOwnerTag      : 0xfffff801`6470c14c
   +0x060 PrivateDbgInfo   : _TDR_DEBUG_REPORT_PRIVATE_INFO
   +0xb00 pDbgReport       : 0xffffe000`c2c3f750 _WD_DEBUG_REPORT
   +0xb08 pDbgBuffer       : 0xffffc000`bd000000 Void
   +0xb10 DbgBufferSize    : 0x37515
   +0xb18 pDumpBufferHelper : (null) 
   +0xb20 pDbgInfoExtension : 0xffffc000`ba7e47a0 _DXGKARG_COLLECTDBGINFO_EXT
   +0xb28 pDbgBufferUpdatePrivateInfo : 0xffffc000`bd000140 Void
   +0xb30 ReferenceCount   : 0n1
   +0xb38 pResetCompletedEvent : (null)

参数 2 包含指向负责的设备驱动程序模块(例如,所有者标记)的指针。

1: kd> ub fffff8016470c14c
nvlddmkm+0x84c132:
fffff801`6470c132 cc              int     3
fffff801`6470c133 cc              int     3
fffff801`6470c134 48ff254d2deaff  jmp     qword ptr [nvlddmkm+0x6eee88 (fffff801`645aee88)]
fffff801`6470c13b cc              int     3
fffff801`6470c13c 48ff252d2eeaff  jmp     qword ptr [nvlddmkm+0x6eef70 (fffff801`645aef70)]
fffff801`6470c143 cc              int     3
fffff801`6470c144 48ff257d2deaff  jmp     qword ptr [nvlddmkm+0x6eeec8 (fffff801`645aeec8)]
fffff801`6470c14b cc              int     3

我们可能希望使用 k、kb、kc、kd、kp、kP、kv(显示堆栈回溯)命令检查堆栈跟踪。

1: kd> k
 # Child-SP          RetAddr           Call Site
00 ffffd001`7d53d918 fffff801`61ba2b4c nt!KeBugCheckEx [d:\th\minkernel\ntos\ke\amd64\procstat.asm @ 122]
01 ffffd001`7d53d920 fffff801`61b8da0e dxgkrnl!TdrBugcheckOnTimeout+0xec [d:\th\windows\core\dxkernel\dxgkrnl\core\dxgtdr.cxx @ 2731]
02 ffffd001`7d53d960 fffff801`61b8dd7f dxgkrnl!ADAPTER_RENDER::Reset+0x15e [d:\th\windows\core\dxkernel\dxgkrnl\core\adapter.cxx @ 19443]
03 ffffd001`7d53d990 fffff801`61ba2385 dxgkrnl!DXGADAPTER::Reset+0x177 [d:\th\windows\core\dxkernel\dxgkrnl\core\adapter.cxx @ 19316]
04 ffffd001`7d53d9e0 fffff801`63c5fba7 dxgkrnl!TdrResetFromTimeout+0x15 [d:\th\windows\core\dxkernel\dxgkrnl\core\dxgtdr.cxx @ 2554]
05 ffffd001`7d53da10 fffff801`63c47e5d dxgmms1!VidSchiRecoverFromTDR+0x11b [d:\th\windows\core\dxkernel\dxgkrnl\dxgmms1\vidsch\vidscher.cxx @ 1055]
06 ffffd001`7d53dbc0 fffff801`aa55c698 dxgmms1!VidSchiWorkerThread+0x8d [d:\th\windows\core\dxkernel\dxgkrnl\dxgmms1\vidsch\vidschi.cxx @ 426]
07 ffffd001`7d53dc00 fffff801`aa5c9306 nt!PspSystemThreadStartup+0x58 [d:\th\minkernel\ntos\ps\psexec.c @ 6845]
08 ffffd001`7d53dc60 00000000`00000000 nt!KxStartSystemThread+0x16 [d:\th\minkernel\ntos\ke\amd64\threadbg.asm @ 80]

我们还可以在导致此停止代码的代码中设置断点,并尝试单步前进到故障代码,如果我们可以始终如一地重现停止代码。

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

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

如果我们不具备使用 Windows 调试器来解决此问题的能力,我们可以使用一些基本的故障排除技术。

  • 检查事件查看器中的系统日志以获取可能有助于识别导致此错误检查的设备或者驱动程序的其他错误消息。
  • 如果在错误检查消息中识别出驱动程序,请禁用该驱动程序或者与制造商联系以获取驱动程序更新。
  • 验证所有与图形相关的软件(例如 DirectX 和 OpenGL)都是最新的,并且所有图形密集型应用程序(例如游戏)都已完全修补。
  • 确认安装的任何新硬件都与安装的 Windows 版本兼容。例如,我们可以在 Windows 10 规范中获取有关所需硬件的信息。
  • 使用安全模式
    考虑使用安全模式来帮助隔离此问题。在 Windows 启动期间,使用安全模式仅加载最低要求的驱动程序和系统服务。要进入安全模式,请使用“设置”中的“更新和安全”。选择恢复 -> 高级启动以引导至维护模式。在出现的菜单中,选择疑难解答 -> 高级选项 -> 启动设置 -> 重新启动。Windows 重新启动到启动设置屏幕后,选择选项 4. 5 或者 6 以启动到安全模式。
    可以通过在启动时按功能键(例如 F8)来使用安全模式。有关特定启动选项,请参阅制造商提供的信息。
  • 运行 Windows 内存诊断工具来测试内存。在控制面板搜索框中,键入内存,然后选择诊断计算机的内存问题。 运行测试后,使用事件查看器在系统日志下查看结果。查找 MemoryDiagnostics-Results 条目以查看结果。
  • 我们可以尝试运行系统制造商提供的硬件诊断程序。
  • 有关其他常规故障排除信息,请参阅蓝屏数据。

原因

当系统在处理最终用户命令或者操作时出现完全冻结或者挂起时,图形中会出现常见的稳定性问题。
通常 GPU 忙于处理密集的图形操作,通常是在玩游戏期间。
没有屏幕更新发生,用户认为他们的系统被冻结。
用户通常等待几秒钟,然后按电源按钮重新启动系统。
Windows 尝试检测这些有问题的挂起情况并动态恢复响应式桌面。

此检测和恢复过程称为超时检测和恢复 (TDR)。
默认超时为 2 秒。
在显卡的 TDR 过程中,操作系统的 GPU 调度程序调用显示微型端口驱动程序的 DxgkDdiResetFromTimeout 函数重新初始化驱动程序并重置 GPU。

在此过程中,操作系统告诉驱动程序不要访问硬件或者内存,并为其提供一小段时间让当前正在运行的线程完成。
如果线程未在超时内完成,则系统错误检查为 0x116 VIDEO_TDR_FAILURE。
有关详细信息,请参阅线程同步和 TDR。

系统还可以使用 VIDEO_TDR_FAILURE 检查错误是否在短时间内发生了大量 TDR 事件,默认情况下,一分钟内超过 5 个 TDR。

如果恢复过程成功,将显示一条消息,指示“显示驱动程序停止响应并已恢复”。

有关详细信息,请参阅位于超时检测和恢复 (TDR) 中的超时检测和恢复 (TDR)、Windows 8 中的 TDR 注册表项和 TDR 更改。

日期:2020-09-17 00:15:35 来源:oir作者:oir