c# – 从.NET程序中获取全局根

c# – 从.NET程序中获取全局根,第1张

概述我最近开始使用ANTS分析工具进行生产工作.除了惊讶于他们的精彩之外,我不禁想知道他们是如何工作的.例如,最有用的功能之一允许您可视化正在运行的程序全局根,其中包含对不同类型值的引用数. 该工具如何获取该信息? (完全披露:我在Visual Studio Profiler团队,但以下信息是公开的) 您可以通过编写在您要定位的流程内运行的CLR分析器来完成此 *** 作. CLR分析器是C COM对象,当 我最近开始使用ANTS分析工具进行生产工作.除了惊讶于他们的精彩之外,我不禁想知道他们是如何工作的.例如,最有用的功能之一允许您可视化正在运行的程序的全局根,其中包含对不同类型值的引用数.

该工具如何获取该信息?

解决方法 (完全披露:我在Visual Studio Profiler团队,但以下信息是公开的)

您可以通过编写在您要定位的流程内运行的CLR分析器来完成此 *** 作. CLR分析器是C COM对象,当设置了COR_PROfileR和COR_PROFIliNG_ENABLED环境变量时,它们将被运行时实例化(参见here).有两个主要的CLR profiling interfaces,特别是ICorProfilerCallbackICorProfilerInfo.ICRProfilerCallback是CLR用来通知您订阅的特定事件(模块加载,函数JIT补充,线程创建,GC事件),而ICorProfilerInfo可以由您使用profiler,用于获取有关已加载程序集的线程,模块,类型,方法和元数据的其他信息.您可以使用此接口获取有关已分配类型的符号信息.

使用您的探查器进程,您可以强制GC到ICorProfilerInfo::ForceGC. GC完成后,您的探查器将通过ICorProfilerCallback2::GarbageCollectionFinished得到通知,您将通过ICorProfilerCallback2::RootReferences2获得根参考.当您将根参考信息与ICorProfilerCallback::ObjectReferences组合时,您可以获取.NET应用程序的完整对象引用图.

您可以使用ICorProfilerCallback::ObjectAllocated回调来获取更多实时信息,以确定何时创建单个CLR对象.但是,这可能很昂贵,因为每个分配的对象至少会产生一个额外的函数调用.您可以通过将CLR分配的ObjectID映射到您自己的内部ID来跟踪单个对象.给定对象的ObjectID是一个短暂的指针,因为它可以随着垃圾收集的发生而改变,这可能导致对象在压缩过程中移动.此过程如here所示.您可以使用ICorProfilerCallback::MovedReferences中的信息来跟踪移动的对象.

为了激活上面提到的回调,您需要告诉您对它们感兴趣的CLR概要分析API.您可以通过在调用ICorProfilingInfo::SetEventMask时将COR_PRF_MONITOR_GC和COR_PRF_MONITOR_OBJECT_ALLOCATED指定为事件标志的一部分来执行此 *** 作.

DavID broman是CLR分析器的开发人员,his blog提供了大量有关分析的大量信息,包括您可能遇到的所有疯狂陷阱和问题.

总结

以上是内存溢出为你收集整理的c# – 从.NET程序中获取全局根全部内容,希望文章能够帮你解决c# – 从.NET程序中获取全局根所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1225065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存