在.NET应用程序中查看所有调用的最简单方法(分析/仪器化)

5
我正在尝试编写一个.NET应用程序,可以对其他.NET进程进行分析,并列出它们所做的所有调用,包括传递参数的值。
我知道使用类似于"ICorProfilerCallback2"的工具编写自己的分析器可以帮助解决这个问题,但这似乎是一项相当具有挑战性的任务。在着手进行之前,我想确定这是唯一的方法。
我研究了开源的.NET分析器和类似的工具,例如part-cover、CLR Profiler v4.0等,但它们似乎都没有提供一个托管的API来完成这个任务,并且它们做的事情比我需要的要多(如内存分析等)。
是否还有其他方法可以做到这一点?是否有更简单的方法来进行这种分析?在这里我的选择是什么?

你实际上需要看到“所有”调用吗?还是只有关键调用?也许类似Mini-Profiler的东西可以帮助,但我也在考虑“PostSharp”... - Marc Gravell
@MarcGravell 我要分析的应用程序不是我的,所以我不认为Postsharp可以做到。 - dr. evil
不确定这是否真的是一个API,但SlimTune至少具有某种插件功能... - ekolis
@MarcGravell 我想知道是否可以使用Postsharp和一些IL编织工具来完成这个任务。即使用Mono Cecil注入Postsharp属性(尽管据我所知,这将需要在分析之前生成新的二进制文件)。 - dr. evil
扩展 WinDbg 怎么样? :-) - M.A. Hanin
你需要观察的调用,是在程序集之间还是需要观察程序集内部的调用。 - Scott Chamberlain
1个回答

1

我们曾经使用 Mono Cecil 编写过这样一个工具。

使用Cecil,您可以将IL代码发射到现有的程序集中。这样,您就可以在每个方法的开头添加对您的托管DLL的调用。

然而,IL注入非常棘手,因为有许多情况需要考虑,但是这是可行的。好的一面是:一旦调用了您的托管DLL,您所有的代码都可以用高级语言(例如C#)编写,因此“唯一”的棘手部分是编织对您的API的调用。

使用Cecil仪器化的工作流程可能如下:

  1. 获取您的二进制文件(构建或下载)
  2. 使用使用Cecil的自己的后编译器对它们进行仪器化
  3. 运行修改后的程序集,这些程序集反过来调用您的托管DLL
  4. 您的DLL存储或分析数据

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