clr-profiling-api - 我们可以在 CLR 分析中使用 IMetaDataImport2 从类中调用方法吗?
问题描述
我正在使用 CLR 分析 API 来分析我的 .NET Core 应用程序。
在方法中输入钩子我可以得到classID和元数据。有没有办法使用元数据从该类调用另一个函数?
例如:考虑下面的例子。在 CommonStats 类中,当为函数 ProcessRequestInternal 调用方法进入/退出挂钩时,我需要调用函数 GetDefaultValue 并保存返回值。
public class CommonStats
{
String test =
private void ProcessRequestInternal(String str)
{
test = str;
}
protected override string GetDefaultValue()
{
if(test.StartsWith("/")) {
return "SUCCESS";
}
return "FAILURE";
}
}
解决方案
通常,不建议(并且不可能通过 Profiler API)从分析器调用托管代码。这样做的方法是执行 IL 重写。
来自https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/profiling-overview:
尽管从设计角度来看这是可能的,但分析 API 不支持托管组件。CLR 探查器必须完全不受管理。尝试在 CLR 探查器中组合托管和非托管代码可能会导致访问冲突、程序失败或死锁。探查器的托管组件将触发事件返回到它们的非托管组件,这些组件随后会再次调用托管组件,从而产生循环引用。
CLR 探查器可以安全调用托管代码的唯一位置是方法的 Microsoft 中间语言 (MSIL) 主体。修改 MSIL 主体的推荐做法是使用 ICorProfilerCallback4 接口中的 JIT 重新编译方法。
开始 IL 重写的一个好地方是http://www.debugthings.com/2015/09/16/rewriting-il-remotely-part1/。在 David 的 Broman 博客中有很多很好的信息,这里:https ://github.com/dotnet/coreclr/tree/master/Documentation/Profiling/davbr-blog-archive
推荐阅读
- flutter - Flutter 有除了 material 和 cupertino 之外的小部件吗?
- javascript - 在 foreach 循环中单击一个面板时折叠其他面板
- ruby - 理解 Ruby 中的“.with”
- php - 在 WooCommerce 的地址字段中需要文本和数字
- server - 设置传送 - 使用 Let's Encrypt 配置域名并获取 TLS 证书
- ios - 如何将 Swift 代码(类)与 Objective-C 结合起来?
- database - Clickhouse数据库中的物化视图不显示数据
- java - 如何使用带有日历对象的 AM PM 设置正确的时间?
- node.js - MongoDB搜索多个集合
- c++ - 左移一个数字