1 故障现象
Windows里的his客户端,登录后,打开患者的影像照片,就很容易his卡死。只得将his强杀再开。卡死频率大约每3~6次就会出现1次。
2 初步分析
2.1 检查his安装正确否
通过beyondcompare做文件夹比较,可以认为his安装正确。
2.2 死循环还是卡死
卡死时用procexp查看该进程的cpu消耗以及各个线程的cpu消耗。发现都接近0。可以认为当时,这个进程里的每个线程都是陷入内核不返回,而不是某些线程处于死循环中。
遂对该进程创建dmp。
3 深入分析
3.1 进程dmp分析
3.1.1 看看0号线程在等什么
用windbg打开进程dmp,~*kv
查看每个线程的调用栈。发现wow64字样,这个dmp应该是procexp64抓取的32位进程的dmp。windbg输入!wow64exts.sw
进行切换。然后再~*kv
。
先看0号线程,它的调用栈是:
# ChildEBP RetAddr Args to Child
00 00189424 75d52129 000303cc 0000000d 000000ff user32!NtUserMessageCall+0x15 (FPO: [7,0,0])
01 00189464 75d500d1 008e7e20 00000000 76592744 user32!SendMessageWorker+0x5f2 (FPO: [Non-Fpo])
02 001894ac 06960220 000303cc 06a34518 000000ff user32!GetWindowTextA+0x49 (FPO: [Non-Fpo])
WARNING: Stack unwind information not available. Following frames may be wrong.
03 001894d8 75d4947a 000303cc 069d04d0 000000b6 Report2DL!DllUnregisterServer+0x1027dc
04 001894f8 75d4d205 00000000 00000000 069601e8 user32!InternalEnumWindows+0x5a (FPO: [Non-Fpo])
05 00189518 069603dd 069601e8 069d04d0 00189534 user32!EnumWindows+0x16 (FPO: [Non-Fpo])
06 00189560 0684477b 001895cc 06844789 00189588 Report2DL!DllUnregisterServer+0x102999
07 00189588 06844868 0684739d 00000000 069c4f74 Report2DL+0x477b
08 001895d8 77179280 06840000 00000001 00000000 Report2DL+0x4868
09 001895f8 7717feb7 069c4f64 06840000 00000001 ntdll_77140000!LdrpCallInitRoutine+0x14
0a 001896ec 7717ea8e 00000000 773cc92d 00189890 ntdll_77140000!LdrpRunInitializeRoutines+0x26f (FPO: [Non-Fpo])
0b 00189860 771bd3ff 001898d0 00189890 002db376 ntdll_77140000!LdrpLoadDll+0x472 (FPO: [Non-Fpo])
0c 0018989c 75a82e6a 00000000 001898f0 001898d0 ntdll_77140000!LdrLoadDll+0xc7 (FPO: [Non-Fpo])
0d 001898e4 76429c17 00000000 00000000 00002008 KERNELBASE!LoadLibraryExW+0x233 (FPO: [Non-Fpo])
0e 00189900 76429b9a 00000000 0018997c 00002008 ole32!LoadLibraryWithLogging+0x16 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\w7rtm\com\ole32\common\loadfree.cxx @ 157]
0f 00189924 76429a86 0018997c 00189948 0018994c ole32!CClassCache::CDllPathEntry: