环境:Windows7
工具:Windbg
方法很简单:
1、 使用Windbg直接attach到CPU 100% 的进程上面(另外注意的是如果多核的,可能就不是100%了,譬如双核的可能就是CPU持续保持在50%的消耗)。
2、使用!sunaway命令查看各个线程的消耗程度。
0:027> !runaway
User Mode Time
Thread Time
20:978 0 days 0:07:07.765
0:f58 0 days 0:00:06.015
18:19c 0 days 0:00:00.046
14:48c 0 days 0:00:00.015
13:424 0 days 0:00:00.015
27:eb0 0 days 0:00:00.000
26:a58 0 days 0:00:00.000
25:c30 0 days 0:00:00.000
24:e40 0 days 0:00:00.000
23:c6c 0 days 0:00:00.000
22:9f0 0 days 0:00:00.000
21:974 0 days 0:00:00.000
19:98 0 days 0:00:00.000
17:494 0 days 0:00:00.000
16:418 0 days 0:00:00.000
15:9a8 0 days 0:00:00.000
12:51c 0 days 0:00:00.000
11:f7c 0 days 0:00:00.000
10:54c 0 days 0:00:00.000
9:594 0 days 0:00:00.000
8:570 0 days 0:00:00.000
7:dc 0 days 0:00:00.000
6:110 0 days 0:00:00.000
5:510 0 days 0:00:00.000
4:514 0 days 0:00:00.000
3:50c 0 days 0:00:00.000
2:674 0 days 0:00:00.000
1:648 0 days 0:00:00.000
……
从这个信息我们可以看到20号线程的CPU时间消耗是最多的,不出意外,罪魁祸首就是它了。
3、使用~*kb命令,列出所有线程的callstack,然后查看20号线程的情况,如下:
20 Id: de4.978 Suspend: 1 Teb: 7ff95000 Unfrozen
ChildEBP RetAddr Args to Child
05e8fe84 0202efc2 0202ef97 7c947e71 03d53248 TSVulEngine!TKBLogUpload::PrivateStartUpload+0x16 [d:\...\vul_tkblogupload.cpp @ 220]
05e8fe8c 7c947e71 03d53248 00000001 046e10a8 TSVulEngine!UploadTimerRoutine+0x2b [d:\... \vul_tkblogupload.cpp @ 43]
这样基本就可以确定是神马问题了O(∩_∩)o 。