求助:如何使用VS的Profiler跟踪框架内部的方法调用?
2009-12-05 19:16 Jeffrey Zhao 阅读(6979) 评论(16) 编辑 收藏 举报解决性能问题必须使用Profiler,无论是自己写的实验代码还是一些高级工具,没有数据,而是凭感觉来解决性能问题在绝大部分情况是不靠谱的。VSTS包含了Profiler,也经常见一些博客上用Profiler得到的数据进行性能分析,其中最著名的莫过于Rico Mariani的Performance Quiz系列了。使用VSTS的Profiler可以收集程序运行过程中每个方法的调用次数,所消耗的总时间等等,一目了然,但是我在使用过程中却出现了问题。
例如就拿这篇文章来说,它详细分析了各种解析字符串的方式,最终用Profiler生成的Call Tree如下:
![](http://home.cwru.edu/~ixh10/Blog/Parse/GoodStringsDetail.jpg)
然而,在我却只能收集到:
![](https://images.cnblogs.com/cnblogs_com/JeffreyZhao/168980/o_my-profile-result.png)
看出区别来了不?我只能收集到我写的方法,或是我调用的.NET框架的方法,而我无法获得框架内部方法的调用情况。我搜索了各种资料,尝试了各种可以的选项,都没有效果。后来我又尝试了ANTS Profiler,效果也是一样(只能获得“公开情报”)。于是我怀疑是不是缺少pdb文件的缘故,于是根据Shawn Burke的文章设置了Symbol Server——没有效果。我不甘心,又使用NetMassDownloader下载了pdb文件和.NET Framework源代码,并在VS里进行了设置:
![](https://images.cnblogs.com/cnblogs_com/JeffreyZhao/168980/o_vs08-symbol-path.png)
结果,框架内部方法的调试都正常,但是Profiler的结果还是没有任何改变。而且,等我作完这些尝试之后我忽然意识到,这很可能不是symbol的问题。为什么这么说呢?因为我可以使用CLR Profiler其实可以得到这些结果:
![](https://images.cnblogs.com/cnblogs_com/JeffreyZhao/168980/o_clr-profiler-call-tree.png)
CLR Profiler给出了各方法调用情况,但是我……还没有完全看懂其中的数据,它似乎没有像VS中那么友好的Call Tree展示方式。幸运的是,如果数据是充分的话,我们也可以自己进行分析。而且CLR Profiler是公开源代码的,这样即使有不足指出,我们也可以进行改进。但是,Visual Studio的Profiler又是怎么回事呢?
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步