按照如下步骤进行:
(1)如果在调试,请在vs中的调试菜单中分离菜单项目,将调试进程与vs分离;
(2)启动windebug,设置改进程的符号文件路径,符号文件分为两种,一个是系统的符号文件,一个是自己进程的符号文件,关于符号文件设置比较简单,网络找到即可,我的符号文件设置如下:SRV*d:\sysmbol* http://msdl.microsoft.com/download/symbols;E:\Work\NVMS_V3\trunk\Bin
(3)选择windebug的菜单 File->Attach to a process附加到某一进程,如此就可以用windebug工具调试对应进程,输入各种命令查看当前进程状态
(4)查看cpu占用100%的问题,关键在于查看进程中各个线程占用cpu时间,我们可以使用命令 “!runaway” ,运行如下
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号线程,也就是线程地址为978的线程占用cpu较高,问题症结就在这里了,找到20号线程运行堆栈信息就知道你的进程现在不停的在做什么事情了!!
(5)剩下的就是打印20号线程对应堆栈,找到20号线程占用时间问题,使用命令~20kb(~*kb是查看所有线程堆栈信息)列出20号线程堆栈
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]
一看以上信息就知道cpu耗时就在 PrivateStartUpload函数中,此时检查改函数即可定位到问题所在!