admin 管理员组

文章数量: 887021

一、问题描述

我们在使用windows 系统过程中,经常会遇到执行某些程序的时候,程序窗口显示“未想一个响应”,桌面窗口整个卡死的情况,但是过一段时间会自动恢复,查看任务管理器,并未发现负载异常的进程,一段时间又会出现卡死的情况如此反复。

Windows 官方文档。

二、分析思路

1、窗口卡死,又称UI卡死;windows的UI程序都是消息驱动的,每个窗体有一个消息线程,用于响应用户事件(鼠标、键盘等),也就是一个消息队列。当一个事件里消息线程阻塞了,后面的消息一直卡在消息队列里,卡到一定程度,就界面就停止响应了。所以出现界面卡死,思考的方向是消息循环是不是能出现问题了。下面分析windows程序界面卡死的几个可能的原因:

1)主线程(UI线程)出现死循环:

如果主线程出现死循环,那么windows将不能从消息队列中取出消息,并进行处理,所以出现卡死现象。为了验证是这个原因导致界面卡死,打开任务管理器,如果该进程的cpu使用率一直保持非零,比如一直保持在3%,那么界面卡死的原因是主线程死循环了。

2)主线程和其他的线程由于资源或者锁争夺,出现了死锁

如果主线程由于跟其他的线程由于争夺资源或者锁,出现了死锁,那么主线程会一直等待资源或者锁,导致主线程不能继续往下执行,分发和处理消息,所以出现卡死。这种情况下,任务管理器中这个进程的cpu使用率一般是0,也有意外是除这个线程外,其他的线程也在运行,耗费cpu。所以最好的办法是使用调试器,挂载在这个进程上,观察这个进程的各个线程调用栈,观察线程等待的资源等。

进程被调试挂载了,调试器在一个断点处断下。这种情况出现的非常少,只有在调试一个程序的时候才会出现。

3)程序有GDI对象泄漏,导致界面卡死

对于这种情况。通过观察任务管理器的GDI数据可以发现问题。首先任务管理器的“查看”->“选择列”出现如下的界面,选择GDI对象。这样在任务管理器中就可以看到进程的GDI对象数目了。如果GDI对象数达到千数量级,那么很有可能是这个原因。

2、查看是否中毒和恶意软件注入

现场通过杀毒未发现中毒现象。系统如果感染了病毒、木马,它们会在电脑后台不断的运行复制,导致一直占用CPU资源,电脑系统出现严重卡顿。流氓软件是介于病毒和正规软件之间的软件。如果电脑中有流氓软件,会不经用户许可,自动运行,占用CPU资源等等。此时,就需要使用杀毒、强力卸载软件来进行杀毒和软件的卸载。

3、服务异常排查:

1)Win+R输入:msconfig 打开系统配置

点击”服务”标签卡,勾选”隐藏所有的 Microsoft 服务”,然后点击全部禁用(若您启用了指纹识别功能,请不要关闭相关服务)

点击”启动”标签卡, 点击”打开任务管理器”,然后禁用全部启动项并确定

重启设备尝试。

2)“服务” 界面找到名为“Connected User Experiences and Telemetry”和superfetch的服务,禁用。

4、查看异常服务对系统调用的影响,排除问题

现场因是vm,报vmtools服务处于“未运行”状态,实际服务是启动状态的,造成了系统卡死,重新安装vmtools未果(最新版)。

5、电源选项调试

1)HKEY_Local_Machine\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\0012ee47-9041-4b5d-9b77-535fba8b1442\0b2d69d7-a2a1-449c-9680-f91c70521c60,选择Attributes属性将数值从1改为2;

2)HKEY_Local_Machine\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\0012ee47-9041-4b5d-9b77-535fba8b1442\dab60367-53fe-4fbc-825e-521d069d2456,Attributes属性将数值从1改为2;

3)打开电源设置,更改高级电源设置 —> 展开“硬盘”,把“AHCI Link Power Management- HIPM/DIPM”下的选项都改成“Active”,把“AHCI Link Power Management - Adaptive”下的选项都设置成“0 ms”;把“PCI Express”下的“链接状态电源管理”都设置成“关闭”,并点击确定;

6、powershell脚本调试应用重置

Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “ ( ( (_.InstallLocation)\AppXManifest.xml”}

7、系统更新导致的可能问题

查看最近windows更新,win10强制要求数字签名的驱动,自带了大量驱动。而且会通过系统更新下载没有或者过时的驱动,所以如果你之前使用win7或者win10 1511没有问题而升级到新版本频繁各种问题的原因就极可能是驱动问题。结合事件管理器综合判断。

三、调试工具

1)ProcessExplorer

它是一款windows官方的增强型任务管理工具。Process Explorer不仅可以帮万平米监视或重启、终止任何程序,还可以帮助我们清楚了解程序的运行变化情况。并且Process Explorer还能够看到用户电脑在运行的程序和CPU、内存的使用情况,方便管理电脑的后台程序。
工具下载:Process Explorer v16.43。

2)VTune

3)LoaderLocker:调试助手

参考混合程序集的初始化。

4)ProcDump

ProcDump 是一个命令行实用程序,其主要目的是监视应用程序的 CPU 峰值并在峰值期间生成crash dumps ,管理员或开发人员可以使用它来确定峰值的原因。 ProcDump 还包括挂起的窗口监控(使用与 Windows 和任务管理器使用的窗口挂起的相同定义)、未处理的异常监控并可以根据系统性能计数器的值生成转储。它还可以用作通用进程转储实用程序,您可以将其嵌入到其他脚本中。

使用参考。

5)Windows 调试程序 (WinDbg)

用于调试内核模式和用户模式代码、分析故障转储以及在代码执行时检查 CPU 寄存器。

使用参考。

案例参考。

6)PsSuspend

PsSuspend 允许挂起本地或远程系统上的进程,挂起后可在稍后的某个时间点继续运行,而不是终止消耗资源的进程。

pssuspend.exe pid 挂起进程

pssuspend.exe -r pid 恢复进程

pskill.exe pid 杀死进程,同Linux下的kill

本文标签: 桌面 窗口 程序 Windows