我获得了一个内存转储来分析在Windows 2008 R2(客户端计算机)上运行的服务的高CPU使用率。 转储是使用任务管理器进行的。
我尝试使用提供给我的转储上可用的符号(使用任务管理器转储),但没有成功。 后来,我发现从任务管理器获取的转储无效,因此我使用Windbg转储了在我的系统上。我能够加载符号。
但是,我需要客户机的转储文件。当我通过将服务附加到 Windbg 来消耗大约85%的CPU时尝试转储服务时,令我惊讶的是CPU消耗突然降至0%。
显然,我需要从客户端机器转储来分析发生的事情以及该服务消耗85%CPU的原因。
没有得到如何使用Windbg进行转储,只要按F6附加服务,CPU消耗就会下降到0%。
答案 0 :(得分:6)
当您使用windbg附加时,所有线程都会暂停在您的服务中,直到您发出g
命令。这就是为什么您的服务的CPU消耗为零的原因。但是没关系,因为当CPU消耗 为85%时,你有一个所有线程正在做什么的快照。 ~*kb
命令将显示该信息。然后发出g
,注意CPU消耗量会恢复。当它足够高时,中断(Debug | Break)然后再次运行~*kb
以查看线程正在做什么。重复多次,你应该看到一个模式。此外,每次使用!runaway
可以轻松查看最繁忙的线程。
答案 1 :(得分:5)
使用ETW捕获CPU使用情况的跟踪,而不是使用转储。 ETW跟踪包含一些调用,而不是像转储中那样的快照。要捕获跟踪,请安装Windows Performance Toolkit from the Windows SDK,打开command prompt as admin并运行此命令以捕获CPU使用情况:
xperf -on latency -stackwalk profile -buffersize 2048 -MaxFile 2048 -FileMode Circular&&超时-1&& xperf -d C:\ HighCPUUsage.etl
完成捕获跟踪后,双击ETL文件将其打开。现在设置debug symbols and load them。
现在将CPU使用率(采样)图表拖放到分析窗格,然后选择“按进程,堆栈"
现在展开服务堆栈以查看调用哪些函数:
Microsoft explained this here in a Video。