最近我使用的一台PC随机出现应用程序卡死。卡死的程序可能是VirtualBox虚拟机,可能是资源管理器,也可能是其它软件。有时是一个程序卡死,有时是几个程序卡死,甚至是卡死一大片,整个系统不能动弹,只好触发蓝屏,或者强按4秒,关机重启。
三次挂死
现在回想起来,第一次发生这个问题时,是在写一篇文章,正在收尾完工的时候,整个系统突然不能反应,屏幕全黑,但是老雷没有放弃,插了个USB键盘上去,过了一会,键盘居然有反应了(数字键盘锁定灯可以亮或者暗),于是老雷按下Ctrl + ScrollLock,触发蓝屏,虽然屏幕已经死了,没有显示,但是根据多年的经验,老雷感觉到了蓝屏是成功的,仿佛看到了那缕蓝光冲破黑暗,闪现出来......重启之后,真的发现有dump保存下来,说明老雷的感觉是对的。
第二次发生这个问题是在北京讲课,讲着讲着老雷兴起,想做个即兴的演示给大家看,没想到在搜索要启动的程序时整个系统卡死,突然的事故让老雷有点措手不及,赶紧解释了一下,然后趁课间休息的时间重启系统。
第三次发生是今天,一方面考虑到周五要做的公开课,另一方面考虑到,已经忍了两次,第三次不能忍了,是可忍孰不可忍:-)
这一次挂死的是WinDBG,老雷唤起它是要做内核调试的,目标机冻结,熟悉的int 3出现,一切顺利,但是WinDBG的命令行始终处于BUSY状态。
通常这样的等待是因为WinDBG在找符号,老雷用这个间隙倒茶。
但这一次,倒好茶还是BUSY,老雷意识到是“小鬼”出现了。
偷摸发信被卡牢
再启动一个WinDBG,附加到已经挂死的WinDBG上,~* k,先是看到调试引擎线程卡在一个关键区上:
1 Id: e24.2fb8 Suspend: 1 Teb: 00000063`3def0000 Unfrozen
# Child-SP RetAddr Call Site
00 00000063`3e2ff278 00007fff`3f43be9b ntdll!NtWaitForAlertByThreadId+0x14
01 00000063`3e2ff280 00007fff`3f43bd01 ntdll!RtlpWaitOnAddressWithTimeout+0x43
02 00000063`3e2ff2b0 00007fff`3f414571 ntdll!RtlpWaitOnCriticalSection+0x1a1
03 00000063`3e2ff360 00007fff`3f414490 ntdll!RtlpEnterCriticalSectionContended+0xd1
04 00000063`3e2ff390 00007fff`28b92d69 ntdll!RtlEnterCriticalSection+0x40
05 00000063`3e2ff3c0 00007fff`28b97ade sqmapi!AcquireSessionFromHandle+0x21
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\wd10x64\dbgeng.dll -
06 00000063`3e2ff3f0 00007fff`03849482 sqmapi!SqmAddToStreamString+0x82
07 00000063`3e2ff440 00007fff`038fcbf0 dbgeng!Ordinal327+0x23ce2
08 00000063`3e2ff490 00007fff`038304bb dbgeng!Ordinal327+0xd7450
09 00000063`3e2ff520 00007fff`038307a3 dbgeng!Ordinal327+0xad1b
0a 00000063`3e2ffa10 00007ff6`57094948 dbgeng!Ordinal327+0xb003
0b 00000063`3e2ffa70 00007ff6`57093b1b windbg+0x34948
0c 00000063`3e2ffab0 00007ff6`57095419 windbg+0x33b1b
0d 00000063`3e2ffae0 00007ff6`5707c0c4 windbg+0x35419
0e 00000063`3e2ffb10 00007fff`3eb52774 windbg+0x1c0c4
0f 00000063`3e2ffba0 00007fff`3f470d51 KERNEL32!BaseThreadInitThunk+0x14
10 00000063`3e2ffbd0 00000000`00000000 ntdll!RtlUserThreadStart+0x21
观察这个管件区:
0:010> !locks
CritSec sqmapi!WPP_REGISTRATION_GUIDS+2298 at 00007fff28bc97