我正在考虑将诊断模式构建添加到应用程序中,我正在写这些程序来计算方法使用情况和执行时间,类似于像dotTrace这样的许多代码分析器。.NET分析器如何工作?
我在通过谷歌查找资源时遇到了一些麻烦,但是如何完成此操作;显然这是可能的,但任何人都可以指向我如何在.NET中实现诸如方法调用计数之类的资源吗?
我正在考虑将诊断模式构建添加到应用程序中,我正在写这些程序来计算方法使用情况和执行时间,类似于像dotTrace这样的许多代码分析器。.NET分析器如何工作?
我在通过谷歌查找资源时遇到了一些麻烦,但是如何完成此操作;显然这是可能的,但任何人都可以指向我如何在.NET中实现诸如方法调用计数之类的资源吗?
代码项目文章Creating a Custom .NET Profiler描述了使用CLR探查器钩子创建探查器的过程。
这包括创建实现ICorProfilerCallback2
接口的COM对象,然后使用环境变量来指示,我们希望通过这个类来剖析CLR:当CLR开始一个过程
,它看起来对于两个环境变量:
COR_ENABLE_PROFILING
:此环境变量设置为1或0. 1表示CLR应使用分析器。 0(或不存在此环境变量)表示它不应该使用分析器。COR_PROFILER
:既然我们已经告诉CLR我们想要分析,我们必须告诉它要使用哪个分析器。由于分析器是作为COM对象实现的,因此此环境变量将设置为实现ICorProfilerCallback2
接口的coclass的GUID。
也许我在这里太简单了,但我的解决方案就是记录。使用entlib或log4net并记录调试级别消息。然后你可以写一个脚本/程序来分析日志文件并给你方法数。甚至可能还有其他日志诊断工具。
除非你需要丰富的可视化或实时复杂的关系映射等。你需要一个分析器?对于方法计数和执行时间,日志文件是否足够?一旦你在生产或不关心仪器仪表,你就可以把你的日志级别提升起来,忘掉那些调试信息。
日志记录的问题是不得不通过日志记录调用乱丢我的代码。特别是如果我想要执行某些操作时,我需要至少为每个方法添加3行以上的内容(定时器设置/启动,计时器停止,日志消息调用)。这很麻烦。 – Amasuriel
同意。那就是为什么我会建议像Spring.Net或PostSharp这样的AOP框架。 AOP本身非常棒,不仅仅是为了伐木。诚然,我不会在一个项目中添加一个全新的组件,只是为了测试一种方法或在一个地方保存3行代码,但是如果您经常使用它,那么就需要AOP。 AOP的投资回报率相当高,应该引入的临界点很低,换句话说,任何一个项目都是非常复杂/专业的。事实上,如果你正在考虑采伐,你也应该考虑AOP。我的2美分:-) – Chaitanya
我不知道PostSharp,感谢您的链接。我打算使用Enterprise Library 5进行日志记录,但是我已经对使我的代码混乱的方法调用数量感到惊讶。 – Amasuriel
http://www.codeproject.com/KB/dotnet/dotnetprofiler.aspx – Oded
实现,你将不得不相当低的水平,甚至使用C++(本机),因为你将需要挂钩的.NET运行时本身(例如,请参阅Oded的链接)...另一种选择是使用某种产品(例如SmartAssembly可以配置为构建应用程序中的使用情况报告)... – Yahia
我相信他们基本上将代码分解为IL,然后在每条指令之后注入各种标记。绝对不是微不足道的写入,但我想这就是为什么ANTS的东西太昂贵了。 –