如何用windbg + Very Sleepy打造window平台的C++程序免费调优工具(profiler)
基于Linux平台的免费且优秀的C++ 调优工具很多,而在window平台基本上都是商业的,在google搜了一大圈后来找到一个叫
very sleepy的调优工具http://www.codersnotes.com/sleepy 目前的版本是0.82,已经加入了对多线程的支持。
下载下来用了一下,发现在调试多线程的时候有些不太方便,它是通过选择目前内存任务管理中正在运行的进程的全部或某个线程来进行profiling.
这样的操作适合那些服务类的进程,而如果对于那种运行完就结束的程序就会不方便,我做了实验,如果直接在Very Sleep加载某个程序运行
则最后只会得出第一个启动的线程的统计数据。无法得出其他线程的统计数据,后来笔者摸索了一个方法是利用windbg来配合进行调试的方法。
(windbg is a powerful and great tool)
1. 写个简单的多线程例子程序,这个例子程序是在命令行程序的主线程中创建两个线程,简单重复的输出字符串N遍。
#include "stdafx.h"
#include "iostream"
#include <process.h> /* _beginthread, _endthread */
#include <windows.h>
using namespace std;
void Test(void* dummy)
{
for(int i =0 ;i < 10000; i ++)
{
cout << "1:Hello World" << endl;
}
}
void Test2(void* dummy)
{
for(int i =0 ;i < 10000; i ++)
{
cout << "2:Hello World" << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1 = (HANDLE) _beginthread(Test,0,NULL);
HANDLE hThread2 = (HANDLE) _beginthread(Test2,0,NULL);
WaitForSingleObject(hThread1, INFINITE );
WaitForSingleObject(hThread2, INFINITE );
return 0;
}
2. Windbg运行test.exe,在下图所示中设置断点,并运行到该断点。这一步的目的是为了在刚好在创建完线程后中断,
这样Very Sleepy可以检测到test.exe进程中的所有线程,同时这些线程又暂时挂住。
3.打开Very Sleepy,找到test.exe,选中它后,发现右边窗口显示出test.exe所有的线程,如果Very Sleepy已经打开,则点击Refresh按钮即可看到。
4.这一步则比较搞,因为你必须在windbg继续执行挂起的线程之后,马上点击Very Sleepy的Profile All才能比较准确的统计每个线程的时间。
我是这样做的,在windbg里先输入g不回车,然后把鼠标移到Profile All键上,然后瞬间秒杀”输入回车“ + ”点击鼠标左键“这两个动作。
5. 这时候,可以看到profiling的进行过程,而且提示有多少个线程在运行
6. profiling结束后,可以看到统计结果,这时你可以进行各种操作来分析瓶颈。具体操作就不详说了。