.NET性能分析器是如何工作的?

21

我正在考虑在我正在编写的应用程序中添加诊断模式构建,以计算方法使用和执行时间,类似于像dotTrace这样的许多代码分析器。

但是我在通过谷歌搜索找到实现这样功能的资源时遇到了一些困难。显然,这是可能的,但有没有人可以指点我如何在.NET中实现类似于方法调用计数的功能呢?


8
http://www.codeproject.com/KB/dotnet/dotnetprofiler.aspx - Oded
为了实现这一点,你必须要深入底层,甚至使用 C++(本地)因为你需要钩取 .NET 运行时本身(例如可以查看 Oded 的链接)……另一个选项是使用一些产品(例如 SmartAssembly 可以配置为将使用报告构建到应用程序中)来完成这种任务。 - Yahia
我相信他们基本上将代码反汇编为IL,然后在每个指令之后注入各种标记。这绝对不是一个简单的编写过程,但我猜这就是为什么ANTS工具如此昂贵的原因。 - Mike Christensen
嗯,有趣的链接 - 我一直以为它们是通过检测汇编代码来工作的。 - Mike Christensen
@MikeChristensen,两种方式都可以,但更精确和更“官方”的方式是在链接中所示的方式。 - Yahia
显示剩余3条评论
2个回答

7
Code Project文章"创建自定义.NET Profiler"描述了使用CLR分析器挂钩来创建分析器的过程。
这涉及创建实现ICorProfilerCallback2接口的COM对象,然后使用环境变量指示CLR我们希望通过使用此类进行分析:

当CLR开始一个进程时,它会查找两个环境变量:

  • COR_ENABLE_PROFILING:此环境变量设置为1或0。 1表示CLR应使用分析器。 0(或此环境变量不存在)表示不使用分析器。
  • COR_PROFILER:既然我们已经告诉CLR我们要进行分析,我们必须告诉它要使用哪个分析器。 因为分析器作为COM对象实现,所以此环境变量将设置为实现ICorProfilerCallback2接口的coclass的GUID。

能否同时设置两个性能分析器?如何设置COR_PROFILER环境变量以同时使用两个性能分析器DLL? - Kira
我有所怀疑。特别是因为描述中提到了单个分析器。我想你可以创建一个分析器代理,其他分析器可以订阅它,但这只是一个想法。 - Oded

1
也许我过于简单了,但我的解决方案是记录日志。使用entlib或log4net并记录调试级别的消息。然后,您只需编写一个小脚本/程序来分析日志文件并给出方法计数。甚至可能有其他日志诊断工具。
除非您需要丰富的可视化或实时复杂关系映射等。您需要分析器吗?对于方法计数和执行时间,难道不需要日志文件吗?一旦您进入生产环境或不关心仪器,您就可以将日志记录级别提高并忘记这些调试消息。

1
记录日志的问题在于必须在我的代码中添加记录调用。特别是如果我想要执行时间这样的操作,我需要至少向每个方法添加3行代码(计时器设置/启动、计时器停止、记录消息调用)。这相当混乱。 - Amasuriel
同意。这就是为什么我建议使用像Spring.Net或PostSharp这样的AOP框架。AOP本身就很棒,不仅仅用于日志记录。诚然,我不会为了在一个地方保存3行代码或仅仅为了一个方法而添加一个全新的组件到项目中,但如果您经常使用它,那么就可以使用AOP。AOP的投资回报率非常高,引入它们的临界点非常低,换句话说,任何稍微复杂/专业的项目都应该引入AOP。实际上,如果您考虑日志记录,您真的应该考虑AOP。以上是我的个人看法 :-) - Chaitanya
我之前不知道PostSharp,谢谢提供链接。我原本打算使用Enterprise Library 5来记录日志,但是想到代码中会有很多方法调用,就已经让我感到不爽了。 - Amasuriel
你需要一个分析器吗?对于方法计数和执行时间,日志文件是否足够呢?这是正确的,但最终我想能够做到完整的CPU时间树,而不仅仅是每个方法计数,这意味着需要了解执行路径,这可能很难(但不是不可能)通过日志来实现。 - Amasuriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接