利用WPA进行调用栈追踪(call stack trace)分析
简介
- 在实际开发过程中,我们经常会对开发的程序进行性能测试,从而找到程序的性能瓶颈。那么在找到程序的性能瓶颈之后 ,如何定位性能问题呢,简而言之就是可以直接找出哪一个函数产生了性能开销,如何程序简单之如只有几十行代码,那么可以直接人肉的方式进行定位;但是如果程序大至几十万行代码或者几百万行代码,这个工作量就非常大了。
WPT工具包
提供给我们了一个非常好的方式去完成这种任务,这种方式称为调用栈追踪(call stack trace)
在前面的博文中《如何使用WPR
和WPA
记录系统状态》已经提到过WPT工具包
可以对CPU的活动进行记录。那么调用栈追踪
的原理也是依赖于此,由于CPU活动的记录中包含了CPU每一帧的数据,这一帧的数据当中又包含了调用的函数地址,因此我们依旧可以通过WPA
直观的看出调用了哪些函数以及调用的次数。
下面来介绍调用栈追踪的步骤
1)首先打开我们的测试样例程序StackTrace.exe
,该程序源码在我的Github上《WPT-sample》
2)使用WPR
记录系统状态生成日志文件,关于WPR
和WPA
的使用在博文《如何使用WPR
和WPA
记录系统状态》中有详细的讲述,这里不再赘述。注:勾选上CPU usage选项
3)利用WPA
打开生成的.etl
日志文件,双击左侧栏的Computation
项展开CPU系统活动记录
4)找到我们的StackTrace
进程,右键Filter to Selection
过滤掉其它进程的信息
5)展开[ROOT]
项,就可以看到调用信息,但是现在我们缺少.pdb
符号文件,所以只能看到调用模块,如下图
6)配置我们自己的.pdb
符号文件路径,那这个符号文件在哪里呢,就在我们解决方案的目录中!!其实在我们生成解决方案的时候,MSVC中的链接器就会自动为我们生成一个.pdb
文件,这个文件当中描述了函数地址和函数名称的一些对应关系,现在我们要做的就是配置这个.pdb
文件路径
注:srv*C:\Symbols*http://msdl.microsoft.com/download/symbols是微软自身的符号文件,其中包含了系统调用的名称地址,初次加载可能需要下载这些符号文件
7)加载.pdb
符号文件,初次加载的时候可能要等待一会儿
8)加载完成后,展开[ROOT]
项,便可以看到所有的函数调用过程和调用次数,下图是我的调用栈追踪图片。可以看出writeFunc
这个函数被调用了1037
次,带来了整个CPU90+%(0.6/0.62)
的性能开销