Hello World
Spiga

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

2009-12-05 19:16 by 老赵, 5574 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又是怎么回事呢?

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

16 条回复

  1. 阿K&LiveCai
    *.*.*.*
    链接

    阿K&LiveCai 2009-12-05 19:20:00

    看看

  2. longyu[未注册用户]
    *.*.*.*
    链接

    longyu[未注册用户] 2009-12-05 20:02:00

    dotTrace3.1试过没?

  3. Keep Walking
    *.*.*.*
    链接

    Keep Walking 2009-12-05 20:04:00

    php有跟踪方法性能的

  4. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-05 20:31:00

    是不是使用了“降噪”功能,点击最后一个工具栏按钮(就是那把火后面两格)。确保所有的勾都不要勾选。

  5. 老赵
    admin
    链接

    老赵 2009-12-05 20:36:00

    @Ivony...
    不是,我可疑的选项一个一个试过了,都没有效果。

  6. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-05 20:41:00

    Jeffrey Zhao:
    @Ivony...
    不是,我可疑的选项一个一个试过了,都没有效果。




    但我还是觉得是某个选项的问题,我去重现一下你的问题先。。。。

  7. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-05 21:21:00

    似乎有点明白了,如果使用检测的话,是在编译后的代码中插入检测点,所以这样只可能检测到自己的函数的调用情况,如果使用采样方式的话,就能查到系统函数的调用情况。

    麻烦的是使用采样方式产生的报表的调用堆栈有很多CLR核心的函数的调用。。。。

  8. 老赵
    admin
    链接

    老赵 2009-12-05 21:27:00

    @Ivony...
    这样啊,但是Sampling的话不是不准了么……还有采样也能检查调用栈亚,原来我以为不行呢。

  9. 老赵
    admin
    链接

    老赵 2009-12-05 22:25:00

    @Ivony...
    我试了试,Sampling效果不行啊,脏乱了……感觉也不是第一副图的样子。

  10. mkjeff[未注册用户]
    *.*.*.*
    链接

    mkjeff[未注册用户] 2009-12-06 17:59:00

    在Performance Explorer中點選Session節點(不是Target節點喔)按右鍵[Properties]
    在General頁面中有個[.NET memory profiling collection]區塊

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

    在[Session]->[Porperties]的畫面中還有很多可以微調的東西

  11. 老赵
    admin
    链接

    老赵 2009-12-06 18:33:00

    @mkjeff
    试过了,还是不行的……

  12. lexc[未注册用户]
    *.*.*.*
    链接

    lexc[未注册用户] 2009-12-07 14:22:00

    vs2010貌似没问题

  13. Boon
    *.*.*.*
    链接

    Boon 2009-12-09 16:31:00

    Jeffrey,
    我最近使用RedGate一个产品来做性能分析。供参考:
    http://www.red-gate.com/products/ants_performance_profiler/index.htm

  14. Boon
    *.*.*.*
    链接

    Boon 2009-12-09 16:35:00

    说明一下,我可以跟到。NET内部。

  15. 老赵
    admin
    链接

    老赵 2009-12-09 16:41:00

    @Boon
    我试了,为什么不行……

  16. 辰
    *.*.*.*
    链接

    2009-12-22 15:00:00

    跟踪不了内部方法 有点像 ContextObject 只能截获外部方法。。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我