将进程附加到windbg后,CPU使用率变为0

时间:2015-10-06 07:07:45

标签: c# service windbg windows-server-2008-r2 cpu-usage

我获得了一个内存转储来分析在Windows 2008 R2(客户端计算机)上运行的服务的高CPU使用率。 转储是使用任务管理器进行的。

我尝试使用提供给我的转储上可用的符号(使用任务管理器转储),但没有成功。 后来,我发现从任务管理器获取的转储无效,因此我使用Windbg转储了在我的系统上。我能够加载符号。

但是,我需要客户机的转储文件。当我通过将服务附加到 Windbg 来消耗大约85%的CPU时尝试转储服务时,令我惊讶的是CPU消耗突然降至0%。

显然,我需要从客户端机器转储来分析发生的事情以及该服务消耗85%CPU的原因。

没有得到如何使用Windbg进行转储,只要按F6附加服务,CPU消耗就会下降到0%。

2 个答案:

答案 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使用率(采样)图表拖放到分析窗格,然后选择“按进程,堆栈"

enter image description here

现在展开服务堆栈以查看调用哪些函数:

enter image description here

Microsoft explained this here in a Video