是否有检测 .NET 探查器存在的 API?
Posted
技术标签:
【中文标题】是否有检测 .NET 探查器存在的 API?【英文标题】:Is there an API that detects the presence of .NET profiler? 【发布时间】:2013-01-31 12:49:35 【问题描述】:我正在开发一个使用 Profiling API 动态重写 IL 指令的模拟工具。通常,我们的客户拥有不止一种使用 Profiling API 的商业产品,并且在许多情况下,我们的分析器不会被加载。
我想通过检测 .NET 分析器的存在来改善客户体验。如果发现第三方分析器,我想打印一条消息,帮助客户正确配置他们的环境。
到目前为止,我还没有找到一种可靠的方法来检测 .NET 探查器的存在。我考虑过解析 ID 为 1022 的 Windows 应用程序日志消息并尝试按进程 ID 进行匹配,但它似乎很不稳定。我检查了 SSCLI 实现,结果发现有一个函数 IsProfilerPresent() 可以进行所需的检查。我可以使用类似的公共 Microsoft API 吗?
【问题讨论】:
所有分析器都使用 CLR 提供的相同低级分析器接口。所以像 IsProfilerPresent() 这样的东西不会告诉你任何关于正在使用的特定分析器的信息。 是的,这是真的。我希望获得包含探查器组件的文件名 (.dll)。然后我想我会检查它的有趣属性,如“文件描述”、“产品名称”等。所以,我想我希望 GetProfilerModuleFileName(...) 函数。我将尝试使用 Windows 应用程序日志方法。谢谢。 【参考方案1】:Microsoft 提供了一个Unmanaged Profiling API,使探查器能够通过公共语言运行时 (CLR) 监视程序的执行情况。 API 引用两个环境变量,进程是否应该连接到分析器。这些是
COR_ENABLE_PROFILING:仅当此环境变量存在且设置为 1 时,CLR 才会连接到分析器。 COR_PROFILER:如果 COR_ENABLE_PROFILING 检查通过,CLR 将连接到具有此 CLSID 或 ProgID 的分析器,它必须 之前已存储在注册表中。 COR_PROFILER 环境变量被定义为一个字符串。
取自here
我不是分析应用程序的专家,但 API 似乎是您需要的来源。
【讨论】:
感谢您的快速回复。事实上,这是一种选择。不幸的是,分析器更经常清除环境变量以防止对子进程进行分析。此外,分析器通常使用注册表项(HKLM\SOFTWARE\Microsoft\.NETFramework 或 HKCU\SOFTWARE\Microsoft\.NETFramework)来设置 COR_* 变量,这些变量在加载后也会被分析器清除(再次防止分析其他过程)。我希望 CLR 提供我可以使用的 API。谢谢。以上是关于是否有检测 .NET 探查器存在的 API?的主要内容,如果未能解决你的问题,请参考以下文章