分析思路:通过现象重现时抓取系统dmp文件分析卡死原因
dump分析:卡死的时候曾尝试在后台通过发信令给云桌面的一个组件,拉起一个驱动来抓dmp,但信令发送成功了并没有生成dmp,先顺着这条线索去分析,先看看组件拉起驱动为啥失败了。
以下是组件拉起驱动的栈:
接下来可以看看服务端线程在干嘛,这里可以看到是在ROpenSCManagerW里面获取共享锁的时候处于等待状态了,
原来是获取ScServiceRecordLock 共享锁失败,接下来看下这个共享锁被谁占用了,
以下是364号线程,可以看到该线程正在卸载驱动
再看看具体是在卸载什么驱动
接下来看下卸载驱动为啥没返回:
以下是workitem执行的地方
这里应该是clinkac去反注册PspSetCreateProcessNotifyRoutine
这里卡在进程回调里面了,而反注册进程回调的函数又需要等待进程回调函数执行完成。
那么卡死的原因就很清晰了:在进程创建时clinkac回调会发消息给组件查询创建的进程是否要放过,但组件没有回复消息导致clinkac的进程回调一直hang住,这时候组件重启触发了stop clinkac的操作,stop clinkac本身是通过alpc发到services进程里面去执行的,services 在执行stop clinkac的操作时会获取一个同步锁ScServiceRecordLock并占用,然后去执行unloaddriver,clinkac的unload回调里面会去调用PspSetCreateProcessNotifyRoutine卸载进程回调,但此时有线程卡在回调里面,因此PspSetCreateProcessNotifyRoutine无法返回,最终services里面的其它所有线程都无法再获取到ScServiceRecordLock锁,导致services卡死,进而导致系统卡死。