记一次 .NET 某拍摄监控软件的卡死分析
系统运维 2025-11-26 22:35:27
0
一、记次监控背景
1. 讲故事
今天本来想写一篇 非托管泄露 的拍摄生产事故分析,但想着昨天就上了一篇非托管文章,软件连着写也没什么意思 ,死分换个口味吧 ,记次监控刚好前些天有位朋友也找到我,拍摄说他们的软件拍摄监控软件卡死了,让我帮忙分析下为什么会卡死,死分听到这种软件,记次监控让我不禁想起了前些天 在程序员桌子上安装监控 的拍摄新闻 ,参考如下:
图片
我在想我这不是软件尼玛作恶吗... 😂😂😂 和朋友确认了下还好不是干这个事的。服务器租用
二 、死分WinDbg 分析
1. 为什么会卡死
因为这种监控软件是记次监控窗体程序,所以它的拍摄卡死理应看主线程的调用栈即可, 在windbg中有一个 k 命令 。
复制0:000:x86> kb 8 # ChildEBP RetAddr Args to Child 00 00dbedc0 77835329 0fd54c08 00000000 0fd54c08 ntdll_777d0000!NtWaitForAlertByThreadId+0xc 01 00dbedc0 7783505c 00000000 00000000 0fd54c08 ntdll_777d0000!RtlpWaitOnAddressWithTimeout+0x64 02 00dbee60 77813fd8 0fd543f0 0fd54c04 0000000c ntdll_777d0000!RtlpWaitOnCriticalSection+0x1ac 03 00dbeea8 77813d99 00000000 00dbef04 09d72f87 ntdll_777d0000!RtlpEnterCriticalSectionContended+0x228 04 00dbeeb4 09d72f87 0fd54c04 09d38131 ee66de6e ntdll_777d0000!RtlEnterCriticalSection+0x49 WARNING: Stack unwind information not available. Following frames may be 软件wrong. 05 00dbef04 09d38036 ee66de46 000001fd 00000111 scvncctrl!DllUnregisterServer+0x4ed7 06 00dbef2c 09d3304d 00000111 000001fd 00000111 scvncctrl+0x48036 07 00dbef50 09d341f3 00000111 000001fd 00000001 scvncctrl+0x4304d1.2.3.4.5.6.7.8.9.10.11.从卦象来看 ,程序在 scvncctrl!DllUnregisterServer+0x4ed7 方法中等待 临界区锁,即 RtlEnterCriticalSection 处。
可能有些朋友有疑问,为什么 scvncctrl 后面的偏移值那么大,这是因为 scvncctrl 没有提供公有和私有符号 ,所以无法对应函数名,windbg 只能以 module 为参考点设置偏移,云计算这对 dump 分析产生了很大的阻碍 !
接下来继续看,既然主线程在等待锁 ,那必然有人在持有锁,那到底是谁在持有呢 ?
2. 寻找持有线程
要想找到持有者,可以提取 RtlEnterCriticalSection 方法中的第一个参数 0fd54c04