利用windbg排查CPU占用过高问题
- 问题描述
测试我们自己开发程序时,有时会发生CPU占用过高的问题。对于简单的程序,可能还容易排查是哪个线程占用了CPU。而对于类似流媒体,这样庞大的程序,排查难度较大。本篇案例会介绍一种排查此类问题的方法。
- 排查方法
排查CPU过高的问题,主要的排查点,就是找到CPU被是哪些线程占用了。确定哪个线程占用CPU过高.
windbg的排查方法。
第一步,使用windbg直接attach到CPU占用过高的进程上
第二步,设置对应pdb路径,可以通过以下命令:.reload -f
第三步,使用!sunaway命令查看各个线程的占用CPU情况,如下例子:
0:002:x86> !runaway 7
User Mode Time
Thread Time
2:2460 0 days 0:00:46.597
1:24e4 0 days 0:00:46.566
0:2838 0 days 0:00:00.078
4:b74 0 days 0:00:00.000
3:a50 0 days 0:00:00.000
Kernel Mode Time
Thread Time
4:b74 0 days 0:00:00.000
3:a50 0 days 0:00:00.000
2:2460 0 days 0:00:00.000
1:24e4 0 days 0:00:00.000
0:2838 0 days 0:00:00.000
Elapsed Time
Thread Time
0:2838 0 days 3:36:05.195
3:a50 0 days 3:35:34.947
2:2460 0 days 3:35:34.947
1:24e4 0 days 3:35:34.947
4:b74 0 days 3:34:48.258
从打印可以看出,用户态的CPU,2和1号线程占用CPU非常多,我们通过命令(~线程号s)查看线程堆栈,确定线程的逻辑代码,进一步确定CPU过高的原因。