用途:当内核线程阻塞在驱动同步对象上,或 Driver Verifier 报告锁顺序违规时,用该技能构建并验证循环等待(死锁)关系图。不适合把所有卡顿都当作死锁处理:看门狗 bugcheck 也可能只是 CPU/DPC 进展失败。
主要能力与证据要求:使用内核线程栈、同步对象证据和 Driver Verifier 死锁记录。先加载 windbg-diagnostic-method 并全程遵循其证据排序、假设检验与结论置信度要求。区分已证实的循环或验证器报告的锁序反转、尚可推进的争用、饥饿或阻塞在其它请求上的持有者,以及自旋/IRQL 问题。
使用方式:
- 收集持有者与等待者:!locks、!thread <ethread-address>、!process 0 7。注意 !locks 只枚举 ERESOURCE,并非所有 pushlock、fast mutex、spinlock 的清单;其它原语需用有文档的原语专用检查,并明确列出缺失的持有者。
- 检查记录的锁顺序证据:若启用了 Driver Verifier 死锁检测且转储含记录,使用 !deadlock 1,查看报告的资源、获取顺序与线程。验证器可能在死锁尚未形成前就发现不安全顺序;没有相应验证/历史时空结果不构成安全证明。Verifier 设置见 windbg-kernel-verifier-triage。
- 构建并检验关系图(A 持有 X 等待 B 持有的 Y,B 持有 Y 等待 X),为每条边给出证据,检查递归获取、锁下回调、I/O 完成依赖和销毁路径。涉及 IRP 时转 windbg-kernel-irp-lifecycle-triage,跨越到用户态 COM/RPC 时转 windbg-user-wait-chain-analysis,并沿用已证实的边。
- 定位驱动路径:确定在获取/等待另一资源时持有某资源的调用路径,检查 IRQL、允许的等待、锁层级与对象生命周期;公共符号与捕获状态不足恢复边时,请求授权证据并保持结论暂定。
修复模式:一致的获取层级、缩小锁范围、避免持锁无界等待与跨组件回调、在所有权设计允许时把可能阻塞的销毁移出锁。不要在不保持不变量与完成/取消语义的情况下替换锁或加超时。
验证与限制:记录关系图、受支持的循环/反转及违规驱动路径,测试并发、回调、拆解与相应 Verifier 检查,区分已证实修复与未证实争用假设。使用时不要自动上传转储、锁历史记录或驱动源码。反馈按 FEEDBACK.md 提交给 WinDbg-Feedback,并注明本技能名与 plugin.json 中的包版本。