问题标签 [clr-profiling-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何让两个进程写在同一个 NamedPipe 上?
因此,分析器是用 C++ 编写的,并在要分析的进程启动时由 CLR 自动启动。然后该进程启动另一个应用程序(分析的主要目标)。Profiler 也会为此过程启动。所有这一切都得到了照顾,但问题是:这两个分析器中只有一个可以通过 NamedPipe 与前端应用程序通信。我需要两个分析器在同一个管道上编写,以便前端应用程序保持直接和简单。这是否可以使用某种信号量来确保其中一个进程一次写入管道?我使用 CreateFile() 函数在探查器中打开管道。
c++ - 在 ClrProfiler 中,如何从 ObjectID 获取托管对象
我正在为一些自定义需求构建一个.Net Profiler,即使它在代码中得到了正确处理,我也需要捕获异常详细信息。为此——
- 我已经实现了 ICorProfilerCallback
- 为 COR_PRF_MONITOR_EXCEPTIONS 设置事件掩码
- 实现了 ExceptionThrown 回调
到目前为止一切顺利,我正在为每个抛出的异常获取回调。但是,它给出了 OjbectID,它是一个指向实际异常对象的指针。我想要有关异常的更多详细信息,例如消息、调用堆栈等。
如何从 ObjectID 获取对象详细信息?
c# - IL Rewrite 无法加载 .Net DLL
我已经为一些自定义要求构建了 IL Rewriter。它所做的只是
- 为另一个 .Net DLL(新建的自定义 DLL)创建方法引用
- 为少数必需的方法注入结语和序言,它们在内部调用上述方法引用。
一切都适用于示例 Windows 窗体应用程序。然而,对于 web 应用程序,epilogue & prologue 被正确注入。但是,当它被调用时,它会抛出以下错误 -
System.IO.FileLoadException:加载此程序集会产生与其他实例不同的授权集。(来自 HRESULT 的异常:0x80131401)
不知何故,新构建的 .Net DLL 没有为 WebApp 加载,而同样适用于 Windows App。
如果我禁用 IL Rewrite,一切都会按预期正常工作。这意味着 IL Rewrite 导致错误。
任何解决方案将不胜感激
c++ - 使用 GetFunctionInfo 从 FunctionID 中获取函数的名称
我正在使用该ICorProfilerInfo
接口编写 CLR 分析器。
使用SetEnterLeaveFunctionHooks
时,回调方法传递一个FunctionID
.
如何获取给定 this 的函数的元数据(特别是我的名字)FunctionID
?
一篇 MSDN 文章建议第一次调用应该是GetFunctionInfo
. 此功能的文档指出:
探查器代码可以调用 ICorProfilerInfo::GetModuleMetaData 来获取给定模块的元数据接口。然后可以使用返回到 pToken 引用的位置的元数据令牌来访问函数的元数据。
它没有详细说明最后一句话('元数据令牌......可用于访问函数的元数据')。这是如何运作的?
到目前为止,我正在执行以下操作:
我试过这样打电话GetTypeRefProps
:
最后的调用返回S_FALSE
,并且不填充szName
。
asp.net - IL 重写到 mscorlib 崩溃 w3wp.exe
我已经构建了 IL Rewriter 来监视在 ASP.Net WebApp 中打开的任何文件。为此,我正在为 mscorlib 的 FileStream 类中名为“Init”的私有方法重写 IL。在这里,我注入了结尾/序言以注册自定义回调。
注射工作正常。每当在 Windows 应用程序中打开文件时,也会调用自定义回调。
但是,当我对 ASP.Net Web 应用程序执行相同操作时,它会不断崩溃并出现以下错误 -
System.ExecutionEngineException 未处理消息:System.Web.dll 中发生“System.ExecutionEngineException”类型的未处理异常
我不明白它是否适用于基于 .Net 的桌面应用程序,那么为什么它不适用于基于 .Net 的 Web 应用程序,即 ASP.Net。Web 和桌面应用程序有什么区别?
谷歌搜索上述错误没有产生任何解决方案:(
c# - CLR 分析:在 catch 块内抛出后的 DoStackSnapshot 给出了错误的指令指针
我目前正在编写一个 CLR 分析器,我遇到了一些非常奇怪的事情。当抛出两个不同的异常时,一个来自 try 子句,一个来自 catch 子句,CLR 通知我相同的指令指针。更具体地说:我已注册接收 ExceptionThrown 回调
virtual HRESULT STDMETHODCALLTYPE ExceptionThrown(ObjectID thrownObjectId);
在该回调中,我在当前线程(https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilerinfo2-dostacksnapshot-method)上启动了一个 DoStackSnapshot 。CLR 为每一帧调用我的方法:
HRESULT stackSnapshotCallback(FunctionID funcId, UINT_PTR ip, COR_PRF_FRAME_INFO,
ULONG32, BYTE context[], void *clientData)
但是,如果我从 try 子句和相应的 catch 子句抛出异常(代码示例如下),我会收到两者的相同 ip。我还要提到,这不是重新抛出的情况,这是预期的,而是一个全新的异常,甚至可能发生在 catch 的调用堆栈深处。
在对此进行更多研究并深入研究 CoreCLR 代码后,我找不到发生这种情况的原因,这就是我在这里问这个问题的原因。我还要提到,这很容易在普通的 C# 调试器中重现,我觉得这很令人震惊。我使用过 .Net Framework 4.5,但这也发生在 4.6 和 4.7 上。
我相信,如果我理解为什么下面的 C# 代码会以这种方式运行,我可能会理解为什么 CLR 也会这样做。
这段代码:
产生这个结果:
Inside catch, instruction: 13. line: 54
Outer catch, instruction: 13. line: 54
我还将提到抛出的异常对象确实具有正确的堆栈跟踪。因此,例如,如果我像这样启动 StackTrace 对象:
我确实收到了预期的结果。上面的代码在分析过程中也很奇怪:两个异常抛出共享相同的指令指针。
下面是与 C# 代码匹配的 IL 代码(只是为了验证这不是重新抛出的情况。为了清楚起见,删除了打印):
任何帮助将不胜感激。谢谢!
c++ - 从 TypeRef 为 .Net IL 定义 TypeSpec
我已经构建了自定义 IL 重写器,可以将自定义代码注入到某些方法中。这次注入的一部分,我想实例化List<int>
. 我已经找到了 List~1 的 mdTokenRef。
从这个 mdTokenRef 中,我如何定义或获取 TypeSpec?我可以为此定义 TypeSpecBlog,如下所示。但是,寻找 ICorProfiler API 来查找 TypeSpec。
c++ - 如何从 COR Profiler 中的 AssemblyID 获取程序集信息?
我想捕获所有已加载程序集的信息以及公钥、版本等元数据。为此,我使用 ICorProfiling API 和回调开发了 .Net 自定义分析器。我可以通过订阅 AssemblyLoadFinished 事件来捕获加载的程序集 ID。但是从这个 AssemblyID 中,我如何获取程序集元数据,如公钥、版本等。
我找到了一个方法'IMetaDataAssemblyImport::GetAssemblyProps'。但它接受程序集令牌(即 mdAssembly)。如何将 AssemblyID 转换为 mdAssembly?
clr - 我可以从物理路径加载托管 C# DLL,而不是通过 CLRProfiler 从 GAC 加载
托管 DLL 在 GAC 中时可以使用公钥令牌和程序集名称加载。
我想从物理路径加载 DLL 引用,而不是从 GAC 加载。
我尝试了下面的代码,
上面的代码将 DLL 加载到进程中,它没有将 DLL 加载到 CLR 运行时。所以DefineAssemblyRef 找不到DLL。收到以下错误,
无法加载文件或程序集“MyDotNetAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=8b6549a3d401ea66”或其依赖项之一。该系统找不到指定的文件。
如何将托管 DLL 加载到当前运行时或应用程序域中,以使其通过 C++ 代码工作?
azure - .NET Instrumentation - Function call to Custom Assembly Fails - Azure Web apps
I have deployed my .NET instrumentation profiler into Azure webapps through Visual studio 2012. My profiler does byte code instrumentation which looks like below,
The injected function call resides on a separate assembly dll. In a physical box the assembly will be added in GAC. But in Azure it will be present in a folder in web app location which will be probed in web.config file.
Using DefineAssemblyRef of IMetaDataAssemblyEmit, i define the assembly and it's function in each modules that loads into the process. The issue is the injected function call works only for the functions of the web application modules..! Other modules like System.Web.dll or System.Data.dll is failing to call the function, which makes the Azure web app failed to load with 502 error.
Shortly, injecting into modules other than the web application is getting failed. I guess it to be security issue in loading the custom assembly and I tried setting [assembly: System.Security.AllowPartiallyTrustedCallers]
and PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
and some other security attributes too.. none helped.. How to make this helper assembly to load by the .Net modules.? Is there any other specific security attributes i need to set for the assembly in-order to get loaded..?