在 .NET 应用程序中查看所有调用的最简单方法(分析/检测)
Posted
技术标签:
【中文标题】在 .NET 应用程序中查看所有调用的最简单方法(分析/检测)【英文标题】:Easiest way to watch all calls in a .NET application (profiling / instrumentation) 【发布时间】:2012-08-18 19:03:02 【问题描述】:我正在尝试编写一个 .NET 应用程序,它可以分析其他 .NET 进程并列出它们进行的所有调用,包括传递的参数的值。
我知道用“ICorProfilerCallback2”之类的东西编写我自己的分析器可以帮助解决这个问题,但这似乎是一项非常具有挑战性的任务。在开始之前,我想确定这是唯一的方法。
我研究了开源 .NET 分析器等,例如 part-cover、CLR Profiler v4.0 等,但它们似乎都没有提供托管 API 来执行此操作,而且它们所做的比我需要的要多得多(内存分析等)。
还有其他方法可以做到这一点吗?进行这种分析的更简单方法?我在这里有什么选择?
【问题讨论】:
您真的需要查看“所有”电话吗?还是只是 key 调用?也许像 mini-profiler 这样的东西会有所帮助,但我也在想“PostSharp”这里...... @MarcGravell 我要介绍的应用程序不是我的,所以我认为 Postsharp 做不到。 不确定这是否真的是一个 API,但 SlimTune 至少具有某种插件功能... @MarcGravell 我想知道这是否可以通过使用 Postsharp 和一些 IL 编织工具来完成。即 Mono Cecil 注入 Postsharp 属性(尽管 AFAIK 这需要在分析之前生成新的二进制文件) 扩展 WinDbg 怎么样? :-) 【参考方案1】:我们曾经用Mono Cecil写过这样一个工具。
使用 Cecil,您可以将 IL 代码发送到现有程序集中。这样您就可以在每个方法的开头添加对您的托管 DLL 的调用。
然而,IL 注入非常棘手,因为需要考虑很多情况,但它是可行的。好的一面是:调用托管 DLL 后,您的所有代码都可以以高级方式(例如 C#)编写,因此“唯一”棘手的部分是将调用编织到您的 API。
使用 Cecil 检测的工作流可能如下所示:
-
获取您的二进制文件(构建或下载)
使用您自己的使用 Cecil 的后编译器来检测它们
运行修改后的程序集,然后调用您的托管 DLL
您的 DLL 存储或分析数据
【讨论】:
以上是关于在 .NET 应用程序中查看所有调用的最简单方法(分析/检测)的主要内容,如果未能解决你的问题,请参考以下文章