Spiga

求助:如何使用VS的Profiler跟踪框架内部的方法调用?

2009-12-05 19:16 by Jeffrey Zhao, 4909 visits, 收藏, 编辑

解决性能问题必须使用Profiler,无论是自己写的实验代码还是一些高级工具,没有数据,而是凭感觉来解决性能问题在绝大部分情况是不靠谱的。VSTS包含了Profiler,也经常见一些博客上用Profiler得到的数据进行性能分析,其中最著名的莫过于Rico MarianiPerformance Quiz系列了。使用VSTS的Profiler可以收集程序运行过程中每个方法的调用次数,所消耗的总时间等等,一目了然,但是我在使用过程中却出现了问题。

例如就拿这篇文章来说,它详细分析了各种解析字符串的方式,最终用Profiler生成的Call Tree如下:

然而,在我却只能收集到:

看出区别来了不?我只能收集到我写的方法,或是我调用的.NET框架的方法,而我无法获得框架内部方法的调用情况。我搜索了各种资料,尝试了各种可以的选项,都没有效果。后来我又尝试了ANTS Profiler,效果也是一样(只能获得“公开情报”)。于是我怀疑是不是缺少pdb文件的缘故,于是根据Shawn Burke的文章设置了Symbol Server——没有效果。我不甘心,又使用NetMassDownloader下载了pdb文件和.NET Framework源代码,并在VS里进行了设置:

结果,框架内部方法的调试都正常,但是Profiler的结果还是没有任何改变。而且,等我作完这些尝试之后我忽然意识到,这很可能不是symbol的问题。为什么这么说呢?因为我可以使用CLR Profiler其实可以得到这些结果:

CLR Profiler给出了各方法调用情况,但是我……还没有完全看懂其中的数据,它似乎没有像VS中那么友好的Call Tree展示方式。幸运的是,如果数据是充分的话,我们也可以自己进行分析。而且CLR Profiler是公开源代码的,这样即使有不足指出,我们也可以进行改进。但是,Visual Studio的Profiler又是怎么回事呢?

Add your comment

16 条回复

  1. #1楼 阿K&LiveCai      2009-12-05 19:20
    看看
     回复 引用 查看   
  2. #2楼 longyu[未注册用户]2009-12-05 20:02
    dotTrace3.1试过没?
     回复 引用   
  3. #3楼 Keep Walking      2009-12-05 20:04
    php有跟踪方法性能的
     回复 引用 查看   
  4. #4楼 Ivony...      2009-12-05 20:31
    是不是使用了“降噪”功能,点击最后一个工具栏按钮(就是那把火后面两格)。确保所有的勾都不要勾选。
     回复 引用 查看   
  5. #5楼[楼主] Jeffrey Zhao      2009-12-05 20:36
    @Ivony...
    不是,我可疑的选项一个一个试过了,都没有效果。
     回复 引用 查看   
  6. #6楼 Ivony...      2009-12-05 20:41
    引用Jeffrey Zhao:
    @Ivony...
    不是,我可疑的选项一个一个试过了,都没有效果。



    但我还是觉得是某个选项的问题,我去重现一下你的问题先。。。。
     回复 引用 查看   
  7. #7楼 Ivony...      2009-12-05 21:21
    似乎有点明白了,如果使用检测的话,是在编译后的代码中插入检测点,所以这样只可能检测到自己的函数的调用情况,如果使用采样方式的话,就能查到系统函数的调用情况。

    麻烦的是使用采样方式产生的报表的调用堆栈有很多CLR核心的函数的调用。。。。
     回复 引用 查看   
  8. #8楼[楼主] Jeffrey Zhao      2009-12-05 21:27
    @Ivony...
    这样啊,但是Sampling的话不是不准了么……还有采样也能检查调用栈亚,原来我以为不行呢。
     回复 引用 查看   
  9. #9楼[楼主] Jeffrey Zhao      2009-12-05 22:25
    @Ivony...
    我试了试,Sampling效果不行啊,脏乱了……感觉也不是第一副图的样子。
     回复 引用 查看   
  10. #10楼 mkjeff[未注册用户]2009-12-06 17:59
    在Performance Explorer中點選Session節點(不是Target節點喔)按右鍵[Properties]
    在General頁面中有個[.NET memory profiling collection]區塊

    預設這裡是不會enable的,enable之後就可以看到.NET組件的詳細profiler結果了.

    在[Session]->[Porperties]的畫面中還有很多可以微調的東西
     回复 引用   
  11. #11楼[楼主] Jeffrey Zhao      2009-12-06 18:33
    @mkjeff
    试过了,还是不行的……
     回复 引用 查看   
  12. #12楼 lexc[未注册用户]2009-12-07 14:22
    vs2010貌似没问题
     回复 引用   
  13. #13楼 Boon      2009-12-09 16:31
    Jeffrey,
    我最近使用RedGate一个产品来做性能分析。供参考:
    http://www.red-gate.com/products/ants_performance_profiler/index.htm
     回复 引用 查看   
  14. #14楼 Boon      2009-12-09 16:35
    说明一下,我可以跟到。NET内部。
     回复 引用 查看   
  15. #15楼[楼主] Jeffrey Zhao      2009-12-09 16:41
    @Boon
    我试了,为什么不行……
     回复 引用 查看   
  16. #16楼       2009-12-22 15:00
    跟踪不了内部方法 有点像 ContextObject 只能截获外部方法。。
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1617675 sXp4LYSXDsQ=