CLR提供的另一个强大功能是Profiling API,它(大部分)被第三方工具用于在非常低级别挂钩到运行时。您可以在此概述中找到有关API的更多信息,但在较高级别,它允许您连接在以下情况下触发的回调:
GC相关事件发生
抛出异常
装配/卸载装配
更多,更多
来自BOTR页面的图像
此外还有其他非常强大的功能。首先,您可以设置每次执行.NET方法时调用的挂钩,无论是在运行时还是用户代码中。这些回调被称为“进入/离开”钩子,并且有一个很好的示例显示如何使用它们,但为了使它们工作,您需要了解不同操作系统和CPU架构的“调用约定”,这并不总是容易的。另外,作为警告,Profiling API是一个只能通过C / C ++代码访问的COM组件,你不能在C#/ F#/ VB.NET中使用它!
其次,Profiler能够通过SetILFunctionBody()API在JIT 之前重写任何.NET方法的IL代码。这个API功能非常强大,构成了许多.NET APM工具的基础,您可以在我之前的文章中了解更多关于如何使用它的方法。如何模拟密封类和静态方法以及随附的代码。
ICorProfiler API事实证明,运行时必须执行各种疯狂的技巧才能使Profiling API正常工作,只需查看进入此PR的内容允许重新连接(有关'ReJIT'的详细信息,请参阅ReJIT:A How-To指南)。
所有Profiling API接口和回调的总体定义可在\vm\inc\corprof.idl中找到(请参阅接口说明语言)。但它分为2个逻辑部分,一个是Profiler - >'Execution Engine'(EE)接口,称为ICorProfilerInfo:
// Declaration of class that implements the ICorProfilerInfo* interfaces, which allow the // Profiler to communicate with the EE. This allows the Profiler DLL to get // access to private EE data structures and other things that should never be exported // outside of the EE.这在以下文件中实现:
\VM\proftoeeinterfaceimpl.h
\VM\proftoeeinterfaceimpl.inl
\VM\proftoeeinterfaceimpl.cpp
另一个主要部分是EE - > Profiler回调,它们在ICorProfilerCallback界面下组合在一起:
// This module implements wrappers around calling the profiler's // ICorProfilerCallaback* interfaces. When code in the EE needs to call the // profiler, it goes through EEToProfInterfaceImpl to do so.这些回调在以下文件中实现:
VM\eetoprofinterfaceimpl.h
VM\eetoprofinterfaceimpl.inl
VM\eetoprofinterfaceimpl.cpp
VM\eetoprofinterfacewrapper.inl
最后,值得指出的是,Profiler API可能无法在.NET Core运行的所有操作系统和CPU-arch上运行,例如Linux上的ELT调用存根问题,有关详细信息,请参阅CoreCLR Profiler API的状态。
分析和调试(Profiling v. Debugging)除此之外,“分析”和“调试”确实有一些重叠,因此从CLR调试与CLR分析中了解.NET运行时上下文中不同的API提供了什么是有帮助的。
调试(Debugging)调试意味着不同的事情不同的人,比如我问在Twitter上“ 什么是你调试的.NET程序的途径 ”,并得到了广泛的不同反应,虽然反应两组含有一个很好的工具清单和技术,所以他们值得一试,谢谢#LazyWeb!
但也许这句话最好总结一下Debugging究竟是什么