设置分析环境
注意 |
---|
已对 .NET Framework 4 版中的分析功能进行了重大更改。有关影响分析环境的设置的更改,请参见 .NET Framework 4 中的分析功能。 |
托管进程(应用程序或服务)在启动时会加载公共语言运行时 (CLR)。 在初始化 CLR 时,它会计算以下两个环境变量以确定进程是否应连接到探查器:
COR_ENABLE_PROFILING:只有当此环境变量存在并设置为 1 时,CLR 才会连接到探查器。
COR_PROFILER:如果 COR_ENABLE_PROFILING 检查通过,CLR 将连接到具有此 CLSID 或 ProgID(之前必须已存储在注册表中)的探查器。 COR_PROFILER 环境变量被定义为字符串,如以下两个示例中所示。
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
若要对 CLR 应用程序进行分析,您必须在运行应用程序之前设置 COR_ENABLE_PROFILING 和 COR_PROFILER 环境变量。 您还必须确保探查器 DLL 已注册。
注意 |
---|
从 .NET Framework 4 开始,无需注册探查器。有关在未将探查器注册为 COM 组件的情况下启动探查器的信息,请参见免注册的探查器启动和附加。 |
注意 |
---|
若要在 .NET Framework 4 和更高版本中使用 .NET Framework 版本 2.0、3.0 和 3.5 探查器,您必须设置 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量。有关此变量的更多信息,请参见探查器兼容性设置。 |
环境变量范围
COR_ENABLE_PROFILING 和 COR_PROFILER 环境变量的设置方式将确定这些环境变量的影响范围。 可以通过以下方式之一来设置这些变量:
如果在 ICorDebug::CreateProcess 调用中设置变量,这些变量将只应用于当时正在运行的应用程序。 (它们还将应用于由该应用程序启动的其他应用程序,这些应用程序继承环境。)
如果在命令提示符窗口中设置变量,这些变量将应用于从该窗口中启动的所有应用程序。
如果在用户级别设置变量,它们将应用于用 Windows 资源管理器启动的所有应用程序。 在设置变量后打开的命令提示符窗口将具有这些环境设置,从该窗口中启动的任何应用程序也将具有这些环境设置。 若要在用户级别设置环境变量,请右击**“我的电脑”,单击“属性”,单击“高级”选项卡,单击“环境变量”,然后将变量添加到“用户变量”**列表。
如果在计算机级别设置变量,这些变量将应用于在该计算机上启动的所有应用程序。 在该计算机上打开的命令提示符窗口将具有这些环境设置,从该窗口中启动的任何应用程序也将具有这些环境设置。 这意味着该计算机上的每个托管进程都将随探查器一起启动。 若要在计算机级别设置环境变量,请右击**“我的电脑”,单击“属性”,单击“高级”选项卡,单击“环境变量”,将变量添加到“系统变量”**列表,然后重新启动计算机。 重新启动后,将可以在系统范围内使用这些变量。
如果要分析 Windows 服务,您必须在设置环境变量并注册探查器 DLL 后重新启动计算机。 有关这些注意事项的更多信息,请参见分析 Windows 服务一节。
附加注意事项
探查器类实现 ICorProfilerCallback 和 ICorProfilerCallback2 接口。 在 .NET Framework 2.0 版中,探查器必须实现 ICorProfilerCallback2。 如果不这样做,将不会加载 ICorProfilerCallback2。
在给定环境中,一个探查器一次只能分析一个进程。 您可以在不同的环境中注册两个不同的探查器,但每个探查器必须分析单独的进程。 必须以进程内 COM 服务器 DLL 的形式实现探查器,在对进程进行分析时,该 DLL 将映射到相同的地址空间中。 这意味着探查器在进程内运行。 .NET Framework 不支持任何其他类型的 COM 服务器。 例如,如果探查器想要从远程计算机监视应用程序,它必须在每台计算机上实现收集器代理。 这些代理将分批处理结果,并将结果传递到中央数据收集计算机。
由于探查器是一种在进程内实例化的 COM 对象,因此每个分析的应用程序将有自己的探查器副本。 这样,单一探查器实例将不必从多个应用程序中处理数据。 但是,您必须向探查器的日志记录代码中添加逻辑,以防止其他分析应用程序中的日志文件覆盖。
初始化探查器
当两个环境变量检查都通过时,CLR 将采用与 COM CoCreateInstance 函数类似的方式创建探查器实例。 探查器不是通过直接调用 CoCreateInstance 加载的。 这样,就避免了需要设置线程模型的 CoInitialize 调用。 CLR 随后将调用探查器中的 ICorProfilerCallback::Initialize 方法。 此方法的签名如下所示。
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
探查器必须查询 pICorProfilerInfoUnk 来检索 ICorProfilerInfo 或 ICorProfilerInfo2 接口指针,并保存该指针以便稍后在分析过程中能够请求更多信息。
设置事件通知
探查器随后调用 ICorProfilerInfo::SetEventMask 方法来指定它关注的通知类别。 例如,如果探查器只关注函数进入和离开通知以及垃圾回收通知,它将指定以下内容。
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
通过用这种方式设置通知掩码,探查器可以限制它接收的通知。 此方法可帮助用户建立简单探查器或有特殊用途的探查器。 它还可以缩短发送探查器只会忽略的通知所浪费的 CPU 时间。
某些探查器事件是不可变的。 这意味着,一旦在 ICorProfilerCallback::Initialize 回调中设置了这些事件,就无法禁用这些事件,并且无法启用新事件。 尝试更改不可变的事件将导致返回失败 HRESULT 的 ICorProfilerInfo::SetEventMask。
分析 Windows 服务
分析 Windows 服务与分析公共语言运行时应用程序类似。 这两种分析操作都是通过环境变量启用的。 由于 Windows 服务是在操作系统启动时启动的,因此,在系统启动之前,本主题中前面所述的环境变量必须已存在,并且设置为所需的值。 此外,还必须已在系统上注册了分析 DLL。
在设置 COR_ENABLE_PROFILING 和 COR_PROFILER 环境变量并注册探查器 DLL 后,您应重新启动目标计算机,以使 Windows 服务能够检测到这些更改。
请注意,通过进行这些更改,将可以在系统范围内进行分析。 为了防止对以后运行的每个托管应用程序进行分析,您应在重新启动目标计算机后删除这些系统环境变量。
此方法还会对每个 CLR 进程进行分析。 探查器应向其 ICorProfilerCallback::Initialize 回调中添加逻辑,以检测当前线程是否相关。 如果不相关,探查器使回调失败,而不执行初始化。