利用WPA进行调用栈追踪(call stack trace)分析

简介

  • 在实际开发过程中,我们经常会对开发的程序进行性能测试,从而找到程序的性能瓶颈。那么在找到程序的性能瓶颈之后 ,如何定位性能问题呢,简而言之就是可以直接找出哪一个函数产生了性能开销,如何程序简单之如只有几十行代码,那么可以直接人肉的方式进行定位;但是如果程序大至几十万行代码或者几百万行代码,这个工作量就非常大了。WPT工具包提供给我们了一个非常好的方式去完成这种任务,这种方式称为调用栈追踪(call stack trace)

在前面的博文中《如何使用WPRWPA记录系统状态》已经提到过WPT工具包可以对CPU的活动进行记录。那么调用栈追踪的原理也是依赖于此,由于CPU活动的记录中包含了CPU每一帧的数据,这一帧的数据当中又包含了调用的函数地址,因此我们依旧可以通过WPA直观的看出调用了哪些函数以及调用的次数。

下面来介绍调用栈追踪的步骤
1)首先打开我们的测试样例程序StackTrace.exe,该程序源码在我的Github上《WPT-sample》
打开StackTrace

2)使用WPR记录系统状态生成日志文件,关于WPRWPA的使用在博文《如何使用WPRWPA记录系统状态》中有详细的讲述,这里不再赘述。注:勾选上CPU usage选项
勾选上CPU usage

3)利用WPA打开生成的.etl日志文件,双击左侧栏的Computation项展开CPU系统活动记录
双击Computation项

4)找到我们的StackTrace进程,右键Filter to Selection过滤掉其它进程的信息
右键过滤进程项

5)展开[ROOT]项,就可以看到调用信息,但是现在我们缺少.pdb符号文件,所以只能看到调用模块,如下图
缺少符号文件

6)配置我们自己的.pdb符号文件路径,那这个符号文件在哪里呢,就在我们解决方案的目录中!!其实在我们生成解决方案的时候,MSVC中的链接器就会自动为我们生成一个.pdb文件,这个文件当中描述了函数地址和函数名称的一些对应关系,现在我们要做的就是配置这个.pdb文件路径
pdb文件目录

配置pdb文件路径

添加pdb文件路径

  • 注:srv*C:\Symbols*http://msdl.microsoft.com/download/symbols是微软自身的符号文件,其中包含了系统调用的名称地址,初次加载可能需要下载这些符号文件

7)加载.pdb符号文件,初次加载的时候可能要等待一会儿
加载pdb符号文件

8)加载完成后,展开[ROOT]项,便可以看到所有的函数调用过程和调用次数,下图是我的调用栈追踪图片。可以看出writeFunc这个函数被调用了1037次,带来了整个CPU90+%(0.6/0.62)的性能开销
调用栈分析图片

猜你喜欢

转载自blog.csdn.net/Pig_Pig_Bang/article/details/81079458
今日推荐