代码之家  ›  专栏  ›  技术社区  ›  J D

从.NET程序获取全局根

  •  3
  • J D  · 技术社区  · 14 年前

    我最近开始在生产工作中使用ANTS分析工具。除了对他们的威严感到惊讶之外,我不禁想知道他们是如何工作的。例如,最有用的特性之一可以让您可视化正在运行的程序的全局根,其中包含对不同类型值的引用数。

    2 回复  |  直到 14 年前
        1
  •  17
  •   valiano    6 年前

    (完全公开:我是Visual Studio Profiler团队的成员,但以下信息是公开的)

    COR_PROFILER COR_PROFILING_ENABLED 设置环境变量(请参见 here ). 主要有两种 CLR profiling interfaces ,具体来说, ICorProfilerCallback ICorProfilerInfo ICorProfilerCallback ICorProfilerInfo公司 探查器可用于获取有关加载的程序集的线程、模块、类型、方法和元数据的附加信息。这个接口就是 能够 用于获取有关分配的类型的符号信息。

    使用profiler进程中,可以强制GC通过 ICorProfilerInfo::ForceGC . GC完成后,您的探查器将通过 ICorProfilerCallback2::GarbageCollectionFinished ,您将通过 ICorProfilerCallback2::RootReferences2 ICorProfilerCallback::ObjectReferences ,可以获取.NET应用程序的完整对象引用图。

    ICorProfilerCallback::ObjectAllocated 回调以确定何时创建单个CLR对象。不过,这可能很昂贵,因为您至少要为每个分配的对象生成一个额外的函数调用。可以通过映射指定的CLR来跟踪单个对象 ObjectID 给你自己的内部身份证 对象 here . 您可以使用来自 ICorProfilerCallback::MovedReferences

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

    David Broman是CLR分析器的开发人员,并且 his blog 有大量关于概要分析的重要信息,包括所有可能遇到的疯狂陷阱和问题。

        2
  •  3
  •   Richard Flamsholt    14 年前

    像ANTS这样的分析器使用由CLR本身提供的“分析API”,它可以很简单地告诉您CLR内部发生了什么。例如,有一个API回调方法,在分配对象时发生,该方法被恰当地命名为 ObjectAllocated()

    原始的分析API称为ICorProfilerCallback。以后的版本称为CoreProfilerCallback2和CoreProfilerCallback3。如果你搜索这些名字,你会找到你想要的答案。在codeproject上,您可以看到一个实际示例: Creating a Custom .NET Profiler

    最后一点要注意的是:API不能从C#和VB.NET这样的托管代码中使用。它只能从非托管代码中获得,例如C或C++。例如,一个C#应用程序不能使用这个API来检查它自己的行为和对象。